我有一个C ++代码段,它使用MultiByteToWideChar将UTF-8字符串转换为UTF-16
对于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#代码有什么问题吗?
答案 0 :(得分:6)
您似乎希望将字符串字符视为Windows-1252(通常被错误标记为ANSI)代码点,并将这些代码点解码为UTF-8字节,其中Windows-1252 code point == UTF-8 byte value
。
接受的答案不起作用的原因是它将字符串字符视为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
答案 1 :(得分:3)
也许这一个:
private static string Utf8ToUnicode(string input)
{
return Encoding.UTF8.GetString(input.Select(item => (byte)item).ToArray());
}
答案 2 :(得分:1)
试试这个
string str = "abc!";
Encoding unicode = Encoding.Unicode;
Encoding utf8 = Encoding.UTF8;
byte[] unicodeBytes = unicode.GetBytes(str);
byte[] utf8Bytes = Encoding.Convert( unicode,
utf8,
unicodeBytes );
Console.WriteLine( "UTF Bytes:" );
StringBuilder sb = new StringBuilder();
foreach( byte b in utf8Bytes ) {
sb.Append( b ).Append(" : ");
}
Console.WriteLine( sb.ToString() );
This Link有助于您了解编码及其转化
答案 3 :(得分:1)
使用System.Text.Encoding.UTF8.GetString().
将UTF-8编码的文本作为字节数组传递。该函数返回一个标准的.net字符串,该字符串以UTF-16编码。
示例功能如下:
private string ReadData(Stream binary_file) {
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
// Read string from binary file with UTF8 encoding
byte[] buffer = new byte[30];
binary_file.Read(buffer, 0, 30);
return encoding.GetString(buffer);
}