Unicode转换问题C ++

时间:2011-10-25 00:42:01

标签: unicode locale

我遇到了奇怪的与unicode相关的问题,我无法弄明白。

基本上,我有一个命令行应用程序,当从命令行手动运行时,可以在各种输入上成功调用mbtowcs()(http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/ )操纵字符串,并返回正确的输出。

每当应用程序通过monit自动运行时,此函数不再转换正确的字节数,并且输出基本上是乱码并且散布着unicode错误菱形。我已经针对相同的输入进行了测试。

我怀疑这与机器上的区域设置或某些设置有关(Ubuntu服务器11.04)。我正在调用setlocale(LC_CTYPE,“”);在我的启动功能中成功。

有人可以向我提供有关我应该更改哪些系统设置以使我的代码正常工作的建议吗?

更新:看起来像是在改变

setlocale(LC_CTYPE, "");

setlocale(LC_CTYPE, "en_US.UTF-8");

可能已经解决了这个问题。任何人都可以提供有关为什么需要这些信息的任何信息,或者我如何更改系统设置以避免这种情况?

1 个答案:

答案 0 :(得分:0)

问题是从字节字符串到wchar_t字符串的转换必须依赖于语言环境。这是因为mbstowcs函数需要知道输入字节字符串的字符编码,并且通常使用语言环境来帮助它猜测。

e.g。如果您的输入字节是:

C3 B6

然后,如果解释为UTF-8,则其字符串öwchar_t序列

00F6

但如果被解释为iso-8859-1,那么它是ö序列的wchar_t字符串

00C3 00B6

现在某些字节序列对某些编码无效,这很可能解释了您的unicode错误菱形。如果您不想弄乱语言环境,可以考虑使用iconv库。 wchar_t类型通常对应于UTF-32编码之一(LE或BE),但我不确定它是多么便携。

相关问题