我有这个unicodestring“Param�tres”,è被转换成未知字符。为啥?

Posted

技术标签:

【中文标题】我有这个unicodestring“Param�tres”,è被转换成未知字符。为啥?【英文标题】:I have this unicodestring "Param�tres",the è is converted into unknown char.why?我有这个unicodestring“Param�tres”,è被转换成未知字符。为什么? 【发布时间】:2019-02-01 14:11:48 【问题描述】:

试过sn-ps:

wchar_t txt = L"Hello world";
std::wstring ws(txt);
std::string str(ws.begin(), ws.end());

【问题讨论】:

是代码的问题,还是终端或输出窗口无法显示字符的问题?另请注意,宽字符并不以任何方式暗示 Unicode。 看起来宽字符被切成两半并放入 8 位字符中。我可以建议only working with chars吗? 你是怎么做到的wchar_t txt = L"Hello world";?这甚至可以编译吗?我的意思是,叫我 n00b 但不应该是const wchar_t* txt = L"Hèllo world";。不是这样,它对 OP 的主要问题很重要。 我不太确定您要做什么,但这里有一些将宽字符串转换为 UTF-8 和从 UTF-8 转换的例程,这可能对您有所帮助:***.com/a/51212415/5743288。否则,请澄清您的问题。例如,CatUnicodeString () 是什么? 的目的是向我们的用户表明我们错误地处理了他们的文本并丢失了一些文本。既然看到了,就可以回去解决问题了。 【参考方案1】:

std::string str(ws.begin(), ws.end()) 简单地复制每个wchar_t 按原样,将每个缩小为char,截断未使用的位。这不是您想要做的,因为它只会在不丢失 ASCII 字符数据的情况下工作。

您需要将 wchar_t 数据从 UTF-16/32(取决于您的编译器用于编码 wchar_t 数据的内容)转换到您希望 std::string 保存的任何字符集(ANSI/MBCS、UTF-8、ISO-8869-X 等)。

C++ 标准库minimal 内置了对此类转换的支持(std::wstring_convertstd::wcstombs() 等),因此您可能不得不求助于第 3 方 Unicode 库(ICONV、ICU等)或特定于平台的 API(WideCharToMultiByte() 等)。

由于您不仅要转换 Unicode 字符串,还要比较它们,那么使用 3rd 方 Unicode 库可能是您最好的选择。使用 Unicode 并非易事,因此请利用已经为它完成的艰苦工作。

【讨论】:

以上是关于我有这个unicodestring“Param�tres”,è被转换成未知字符。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeString基本操作(Ring0)

python软文格式转换问题

作为模板参数的函数: if(T receive 2 param)T(a,b);否则 T(a);

是否有一个Boyer-Moore字符串搜索和快速搜索和替换功能以及Delphi 2010 String(UnicodeString)的快速字符串计数?

这个代码线程安全吗

unicode 转换成中文