gpt4 book ai didi

C# Encoding.Convert 与 C++ MultiByteToWideChar

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:59 25 4
gpt4 key购买 nike

我有一个使用 MultiByteToWideChar 将 UTF-8 字符串转换为 UTF-16 的 C++ 代码片段

对于 C++,如果输入是“Hã´tel”,则输出是“Hôtel”,这是正确的

对于 C#,如果输入为“Hôtel”,则输出为“Hôtel”,这是不正确的。

从 UTF8 转换为 UTF16 的 C# 代码如下所示

Encoding.Unicode.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.Unicode,
Encoding.UTF8.GetBytes(utf8)));

在 C++ 中,转换代码如下所示

MultiByteToWideChar(
CP_UTF8, // convert from UTF-8
0, // default flags
utf8.data(), // source UTF-8 string
utf8.length(), // length (in chars) of source UTF-8 string
&utf16[0], // destination buffer
utf16.length() // size of destination buffer, in wchar_t's
)

我希望在 C# 中获得与在 C++ 中相同的结果。 C# 代码有什么问题吗?

最佳答案

您似乎希望将字符串字符视为 Windows-1252(通常被错误标记为 ANSI)代码点,并将这些代码点解码为 UTF-8 字节,其中 Windows-1252 代码点 == UTF-8字节值.

接受的答案不起作用的原因是它将字符串字符视为 unicode 代码点,而不是Windows-1252。它可以摆脱大多数字符,因为 Windows-1252 将它们映射为与 unicode 完全相同,但输入字符像 , , , ', ', 等将失败,因为 Windows-1252 在这个意义上映射这些不同于 unicode。

所以你想要的只是这个:

public static string doWeirdMapping(string arg)
{
Encoding w1252 = Encoding.GetEncoding(1252);
return Encoding.UTF8.GetString(w1252.GetBytes(arg));
}

然后:

Console.WriteLine(doWeirdMapping("Hôtel")); //prints Hôtel
Console.WriteLine(doWeirdMapping("HVOLSVÖLLUR")); //prints HVOLSVÖLLUR

关于C# Encoding.Convert 与 C++ MultiByteToWideChar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12946974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com