从xml中读泰文出来乱码

安小菜 2014-06-13 03:02:38
UTF8格式的xml 存储的泰文数据,使用tinyxml解析出来发现全是问号。然后将其处理成wstring的就可以看到完整的泰文,不乱码。
然后将这份数据推送至其他地方,使用CString来推的。此时 WString到string只能通过转换。但是转换完毕后之前的不乱吗泰文此时蹭了乱码的了。。求助 怎么搞定。。
...全文
325 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
泰文读出成utf8 这一点和xml引擎有关,建议选择一个不自带字符集转换的xml解析器 泰文在内存中是utf8 要使用程序进行处理,转化为unicode字符串如LPCWSTR、wstring等 处理完如果需要传输的话,转成utf8或直接传输unicode CString比较含糊,和编译预处理选项有关,如果真正理解透彻了字符集的话也可以用,如果一知半解就按上边的做,不涉及CString
赵4老师 2014-06-13
  • 打赏
  • 举报
回复
引用 3 楼 unituniverse2 的回复:
看完了才知道原来根本不关xml的事情。。。 多字节编码方式下的特定语种的字符显示需要调整当前线程的区域码设定,在英文版系统和中文版系统下,默认是英文和中文。而多字节编码方式下,不同语言字符集之间存在重合(或者说当前的字节流代表哪种语言只取决于当前所指定的区域码,而不是像unicode方案那样可以通过字符使用的编码区间直接得来)。所以你要做的是设置当前线程的区域,然后再显示。受影响的有界面显示类API和很多CRT里的字符串处理函数(除了strcpy、strlen等少数几个,基本上都受到区域设置的影响)
具体参考下面: Locale Use the setlocale function to change or query some or all of the current program locale information. “Locale” refers to the locality (the country and language) for which you can customize certain aspects of your program. Some locale-dependent categories include the formatting of dates and the display format for monetary values. For more information, see Locale Categories. Locale-Dependent Routines Routine Use setlocale Category Setting Dependence atof, atoi, atol Convert character to floating-point, integer, or long integer value, respectively LC_NUMERIC is Routines Test given integer for particular condition. LC_CTYPE isleadbyte Test for lead byte () LC_CTYPE localeconv Read appropriate values for formatting numeric quantities LC_MONETARY, LC_NUMERIC MB_CUR_MAX Maximum length in bytes of any multibyte character in current locale (macro defined in STDLIB.H) LC_CTYPE _mbccpy Copy one multibyte character LC_CTYPE _mbclen Return length, in bytes, of given multibyte character LC_CTYPE mblen Validate and return number of bytes in multibyte character LC_CTYPE _mbstrlen For multibyte-character strings: validate each character in string; return string length LC_CTYPE mbstowcs Convert sequence of multibyte characters to corresponding sequence of wide characters LC_CTYPE mbtowc Convert multibyte character to corresponding wide character LC_CTYPE printf functions Write formatted output LC_NUMERIC (determines radix character output) scanf functions Read formatted input LC_NUMERIC (determines radix character recognition) setlocale, _wsetlocale Select locale for program Not applicable strcoll, wcscoll Compare characters of two strings LC_COLLATE _stricoll, _wcsicoll Compare characters of two strings (case insensitive) LC_COLLATE _strncoll, _wcsncoll Compare first n characters of two strings LC_COLLATE _strnicoll, _wcsnicoll Compare first n characters of two strings (case insensitive) LC_COLLATE strftime, wcsftime Format date and time value according to supplied format argument LC_TIME _strlwr Convert, in place, each uppercase letter in given string to lowercase LC_CTYPE strtod, wcstod, strtol, wcstol, strtoul, wcstoul Convert character string to double, long, or unsigned long value LC_NUMERIC (determines radix character recognition) _strupr Convert, in place, each lowercase letter in string to uppercase LC_CTYPE strxfrm, wcsxfrm Transform string into collated form according to locale LC_COLLATE tolower, towlower Convert given character to corresponding lowercase character LC_CTYPE toupper, towupper Convert given character to corresponding uppercase letter LC_CTYPE wcstombs Convert sequence of wide characters to corresponding sequence of multibyte characters LC_CTYPE wctomb Convert wide character to corresponding multibyte character LC_CTYPE _wtoi, _wtol Convert wide-character string to int or long LC_NUMERIC
unituniverse2 2014-06-13
  • 打赏
  • 举报
回复
看完了才知道原来根本不关xml的事情。。。 多字节编码方式下的特定语种的字符显示需要调整当前线程的区域码设定,在英文版系统和中文版系统下,默认是英文和中文。而多字节编码方式下,不同语言字符集之间存在重合(或者说当前的字节流代表哪种语言只取决于当前所指定的区域码,而不是像unicode方案那样可以通过字符使用的编码区间直接得来)。所以你要做的是设置当前线程的区域,然后再显示。受影响的有界面显示类API和很多CRT里的字符串处理函数(除了strcpy、strlen等少数几个,基本上都受到区域设置的影响)
sumos 2014-06-13
  • 打赏
  • 举报
回复
然后将这份数据推送至其他地方,使用CString来推的。此时 WString到string只能通过转换。但是转换完毕后之前的不乱吗泰文此时蹭了乱码的了。。求助 怎么搞定。。 推送到哪? 如果是推送到当前程序的其他窗口,那么直接使用wstring(不太习惯用CString,因为CString在unicode是CStringW,在多字节是CStringA)。 如果是通过网络推送到其他Windows,那么可以把wstring转成utf8然后发送
赵4老师 2014-06-13
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 注意有的字体不含泰文。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧