在 wxWidgets 中处理 C 语言字符串真是一件令人头痛的事情,因为 wxWidgets 库是 C++ 编写的,类中的成员函数大多使用 wxChar*, wxString 作为参数。然而众所周知,在 C 语言里,字符串是以字符数组的形式存储,所以当 wxWidgets 需要和一些 C 库结合使用的时候,比如 Lua,难免会遇到将 C 字符串实例化成 wxString 或 wxChar* 对象的过程中出现乱码的问题。而且这种乱码的出现与一般编程中遇到的乱码不太一样,使用的转换方法不正确,不论是中文还是英文都会出现乱码,一视同仁。
一开始,我都是按照文档中的例子使用 wxString::Printf 方法进行转换,通常情况下不会有问题,例如:
wxString temp;
temp.Printf(wxT("abc");//字符显示正确
temp.Printf(wxT("测试");//字符显示正确
但是使用一段时间之后发现 Printf 函数只能正确得到第一个参数中的字符,其他参数中的字符都会变成乱码,即使是英文字符也会有问题,例如:
wxString temp;
const char * str = "abc";
temp.Printf(wxT("%s", "abc");//temp会包含乱码
temp.Printf(wxT("%s", str);//temp会包含乱码
阅读官方文档后,我发现 wxWidgets 还提供了另外一个函数 wxString::FromUTF8,函数声明如下:
static wxString FromUTF8(const char* s)
static wxString FromUTF8(const char* s, size_t len)
使用 wxString::FromUTF8 就可以顺利地解决问题,而且这还是一个静态函数,不需要实例化就可以调用,函数执行成功会返回 wxString 的一个实例:
const char * str = "abc";
wxString::FromUTF8("abc");//返回 wxString 实例,值为"abc"
wxString::FromUTF8(str);//返回值与上一条语句相同
如果遇到要将 wxString 转化成为 char* 的情况,有三个函数可供使用:wxString::c_str(), wxString::wc_str(), wxString::mb_str()
mb_str returns a C string representation of the string, a const char*, regardless of whether Unicode is enabled. In Unicode mode, the string is converted, and data may be lost.
wc_str returns a wide character representation of the string, a wchar_t*, regardless of whether Unicode is enabled. In ANSI mode, the string is converted to Unicode.
c_str returns a pointer to the string data (const char* in ANSI mode, const wchar_t* in Unicode mode). No conversion takes place.
分享到:
相关推荐
- **字符大小写转换**:`MakeLower`和`MakeUpper`方法允许我们将字符串中的所有字符转换为小写或大写形式,这在进行字符串比较或规范化处理时十分便利。 #### 实用功能:`wxWidgets`的辅助函数 除了上述字符串相关...
2. **wxString和std::string转换**:在处理字符串时,wxWidgets使用wxString,而C++标准库使用std::string,开发者在两种类型之间转换时,需要使用相应的转换函数。 ### 参考资料 文中提到了一些参考资料,但具体...
请注意,实际应用中你需要根据实际情况调整连接字符串和查询语句。 总之,通过结合wxWidgets的强大GUI功能和PostgreSQL的数据库管理能力,我们可以创建出既美观又实用的数据库应用。关键在于理解如何在两者之间建立...
压缩包中的"wxsqlite3-3.2.0"可能是一个使用wxWidgets库封装的Sqlite版本,wxWidgets是一个流行的C++ GUI库,它可以让你创建跨平台的用户界面。这个版本可能已经集成了Sqlite3.8.8,并提供了与wxWidgets应用程序无缝...
总的来说,【机房收费管理系统C课程设计】项目涵盖了C语言的基础知识,如数据结构、字符串处理、文件操作,以及面向问题的编程思维。它为学习者提供了一个将理论知识应用于实际问题的平台,有助于提高编程技能和问题...
其次,原代码中的字符串比较功能被更改为使用标准C库的`strcmp`函数。`wxwidgets`库虽然提供了自己的字符串比较方法,但`strcmp`作为C语言经典函数,其执行效率和通用性都得到了广泛验证。这种改变可能提高了代码的...
在C++中,通常我们会使用第三方库来创建图形界面,如Qt、wxWidgets、GTK+等。这些库提供了丰富的组件和API,使得开发者能够轻松地构建交互式的图形界面。在描述中没有明确指出使用了哪个库,但我们可以假设使用的是...
- `strlen`,`strcpy`,`strcat`,`strcmp`:处理字符串长度、复制、连接和比较。 - `strchr`,`strstr`:查找字符或子串。 - `strtok`:分割字符串。 3. 数学函数:math.h - `sin`,`cos`,`tan`:三角函数。 ...
4. **处理结果**:`GetWindowText`会将标题复制到提供的字符数组中,你可以通过打印或进一步处理这个字符串来查看或使用结果。 ```c wprintf(L"当前活动窗口的标题是:%s\n", title); ``` 这里使用`wprintf`是因为`...
1. 字符串处理:在C++中,字符串是由字符组成的序列,可以使用`std::string`类来处理。查字典程序可能会涉及到对用户输入的单词进行比较和查找,这需要利用字符串的成员函数,例如`find()`用于查找子串,`compare()`...
`fscanf`函数用于从打开的文件中读取数据,它的格式化字符串`"%10s%14s%f\n"`指定了从文件中读取的日期、商店名称和费用,并且这些数据被存储到之前定义的字符数组中。 此外,`getch()`函数用于获取单个键盘输入,...
2. 字符串处理:在编程中,字符串处理函数(如C++的`std::string`或Python的`str`)会被用来构建和操作昵称字符串。 3. 用户界面交互:如果这个软件有一个图形用户界面,那么它可能涉及到了GUI编程,如Qt或...
在处理文本文件时,我们通常会使用`fgets()`读取一行,然后使用字符串处理函数如`strtok()`来分割单词。在写入文件时,`fprintf()`是常用的函数,可以将格式化的字符串写入文件。 接下来是单词检索。在C程序中,...
这个程序通过`printf()`函数在命令行中打印出字符串。`stdio.h`是C语言的标准输入输出库,包含了诸如`printf()`等用于处理输入输出的函数。当你在程序中包含这个头文件后,就可以使用其中定义的函数。 接下来,我们...
由于SQLite以UTF-8编码存储字符串,因此wxSQLite3方法提供了wxString和UTF-8字符串之间的自动转换。 这最适合wxWidgets的Unicode构建。 在ANSI版本中,当前的语言环境转换对象(wxConvCurrent)用于与UTF-8之间的...
3. **字符串处理**:在记事本中,文本是以字符串形式存在的,因此需要了解字符串操作函数,如strcat、strcpy、strcmp等。 4. **内存管理**:C和C++允许程序员直接管理内存,因此在实现记事本时,需要了解如何动态...
5. **查找与替换**:这个功能需要字符串匹配算法,如朴素贝叶斯算法、KMP算法或Boyer-Moore算法,以高效地在文本中查找特定模式。 6. **文本格式化**:如果支持文本格式化,比如缩进、换行或自动对齐,可能需要用到...
`printf`函数用于格式化输出字符串。这里使用了`\n`来插入换行符,使得每行文本都能单独显示。 #### 4. 用户交互 ```c printf("按任意键继续..."); getchar(); ``` 为了防止程序立即关闭,从而让用户有足够的时间...
了解如何在C语言中处理字符串资源和实现国际化是重要的一环。 8. **调试和测试**:在开发过程中,有效的调试工具和测试策略能够帮助定位和修复问题。学会使用GDB或其他调试器,以及编写单元测试,能提高开发效率和...
4. 字符数组的使用:在处理字符串时,必须注意字符串在内存中是以字符数组的形式存在的,且以`\0`作为结束标志。因此,给字符数组赋值时,需确保添加此结束标志。例如: ```c strcpy(student.name, "张三"); // ...