`
arust
  • 浏览: 95161 次
  • 性别: Icon_minigender_1
  • 来自: 海底
社区版块
存档分类
最新评论

wxWidgets 中的 C 字符串

    博客分类:
  • lang
阅读更多

在 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.
分享到:
评论

相关推荐

    wxWidgwts编写控制台程序

    - **字符大小写转换**:`MakeLower`和`MakeUpper`方法允许我们将字符串中的所有字符转换为小写或大写形式,这在进行字符串比较或规范化处理时十分便利。 #### 实用功能:`wxWidgets`的辅助函数 除了上述字符串相关...

    windows-codelite-mingw-wxWidgets-环境搭建1.0

    2. **wxString和std::string转换**:在处理字符串时,wxWidgets使用wxString,而C++标准库使用std::string,开发者在两种类型之间转换时,需要使用相应的转换函数。 ### 参考资料 文中提到了一些参考资料,但具体...

    用wxWidgets编写的访问PostgreSQL的例子

    请注意,实际应用中你需要根据实际情况调整连接字符串和查询语句。 总之,通过结合wxWidgets的强大GUI功能和PostgreSQL的数据库管理能力,我们可以创建出既美观又实用的数据库应用。关键在于理解如何在两者之间建立...

    Sqlite3.8.8加密封装

    压缩包中的"wxsqlite3-3.2.0"可能是一个使用wxWidgets库封装的Sqlite版本,wxWidgets是一个流行的C++ GUI库,它可以让你创建跨平台的用户界面。这个版本可能已经集成了Sqlite3.8.8,并提供了与wxWidgets应用程序无缝...

    机房收费管理系统C课程设计

    总的来说,【机房收费管理系统C课程设计】项目涵盖了C语言的基础知识,如数据结构、字符串处理、文件操作,以及面向问题的编程思维。它为学习者提供了一个将理论知识应用于实际问题的平台,有助于提高编程技能和问题...

    mulitget修改版

    其次,原代码中的字符串比较功能被更改为使用标准C库的`strcmp`函数。`wxwidgets`库虽然提供了自己的字符串比较方法,但`strcmp`作为C语言经典函数,其执行效率和通用性都得到了广泛验证。这种改变可能提高了代码的...

    c 图形界面计算器_c gui计算器, c图形界面计算器

    在C++中,通常我们会使用第三方库来创建图形界面,如Qt、wxWidgets、GTK+等。这些库提供了丰富的组件和API,使得开发者能够轻松地构建交互式的图形界面。在描述中没有明确指出使用了哪个库,但我们可以假设使用的是...

    c语言函数库

    - `strlen`,`strcpy`,`strcat`,`strcmp`:处理字符串长度、复制、连接和比较。 - `strchr`,`strstr`:查找字符或子串。 - `strtok`:分割字符串。 3. 数学函数:math.h - `sin`,`cos`,`tan`:三角函数。 ...

    获得当前活动窗口的标题.rar

    4. **处理结果**:`GetWindowText`会将标题复制到提供的字符数组中,你可以通过打印或进一步处理这个字符串来查看或使用结果。 ```c wprintf(L"当前活动窗口的标题是:%s\n", title); ``` 这里使用`wprintf`是因为`...

    C++写的查字典程序

    1. 字符串处理:在C++中,字符串是由字符组成的序列,可以使用`std::string`类来处理。查字典程序可能会涉及到对用户输入的单词进行比较和查找,这需要利用字符串的成员函数,例如`find()`用于查找子串,`compare()`...

    c语言项目程序设计语言.pdf

    `fscanf`函数用于从打开的文件中读取数据,它的格式化字符串`"%10s%14s%f\n"`指定了从文件中读取的日期、商店名称和费用,并且这些数据被存储到之前定义的字符数组中。 此外,`getch()`函数用于获取单个键盘输入,...

    QQ竖立昵称软件源码,编译可用

    2. 字符串处理:在编程中,字符串处理函数(如C++的`std::string`或Python的`str`)会被用来构建和操作昵称字符串。 3. 用户界面交互:如果这个软件有一个图形用户界面,那么它可能涉及到了GUI编程,如Qt或...

    WBDC.rar_c text word count_单词检索_文本 检索 visual_文本文件读写

    在处理文本文件时,我们通常会使用`fgets()`读取一行,然后使用字符串处理函数如`strtok()`来分割单词。在写入文件时,`fprintf()`是常用的函数,可以将格式化的字符串写入文件。 接下来是单词检索。在C程序中,...

    用C语言设计Win32程序(附C语言设计QQ登陆界面实例

    这个程序通过`printf()`函数在命令行中打印出字符串。`stdio.h`是C语言的标准输入输出库,包含了诸如`printf()`等用于处理输入输出的函数。当你在程序中包含这个头文件后,就可以使用其中定义的函数。 接下来,我们...

    wxsqlite3:wxSQLite3-wxWidgetsSQLite3数据库包装器(包括SQLite3加密扩展)

    由于SQLite以UTF-8编码存储字符串,因此wxSQLite3方法提供了wxString和UTF-8字符串之间的自动转换。 这最适合wxWidgets的Unicode构建。 在ANSI版本中,当前的语言环境转换对象(wxConvCurrent)用于与UTF-8之间的...

    C和C++的记事本程序

    3. **字符串处理**:在记事本中,文本是以字符串形式存在的,因此需要了解字符串操作函数,如strcat、strcpy、strcmp等。 4. **内存管理**:C和C++允许程序员直接管理内存,因此在实现记事本时,需要了解如何动态...

    算法与数据结构课程设计报告书-简单的文本编辑器设计.doc

    5. **查找与替换**:这个功能需要字符串匹配算法,如朴素贝叶斯算法、KMP算法或Boyer-Moore算法,以高效地在文本中查找特定模式。 6. **文本格式化**:如果支持文本格式化,比如缩进、换行或自动对齐,可能需要用到...

    母亲节c语言程序代码.doc

    `printf`函数用于格式化输出字符串。这里使用了`\n`来插入换行符,使得每行文本都能单独显示。 #### 4. 用户交互 ```c printf("按任意键继续..."); getchar(); ``` 为了防止程序立即关闭,从而让用户有足够的时间...

    用c语言设计屏幕界面技术

    了解如何在C语言中处理字符串资源和实现国际化是重要的一环。 8. **调试和测试**:在开发过程中,有效的调试工具和测试策略能够帮助定位和修复问题。学会使用GDB或其他调试器,以及编写单元测试,能提高开发效率和...

    学生成绩信息管理系统

    4. 字符数组的使用:在处理字符串时,必须注意字符串在内存中是以字符数组的形式存在的,且以`\0`作为结束标志。因此,给字符数组赋值时,需确保添加此结束标志。例如: ```c strcpy(student.name, "张三"); // ...

Global site tag (gtag.js) - Google Analytics