Unicode 字符串中的泰语字符问题

par*_*rag 0 .net c# globalization unicode-string thai

我有一个包含几个泰语字符的字符串。此字符串使用 unicode 字符。但是我在 IDE 中看不到泰语字符,即使我在文本文件中写了字符串。如果我想正确地看到泰文字符,我必须编写以下代码

 var text = "M_M-150 150CC. เดี่ยว (2 For 18 Save 2)";
 var ascii = Encoding.Default.GetBytes(text);           
 text = Encoding.UTF8.GetString(ascii);
Run Code Online (Sandbox Code Playgroud)

应用上述逻辑后,我可以正确地看到带有泰语字符的字符串。这是输出

// notice the thai character ?????? in the string M_M-150 150CC. ?????? (2 For 18 Save 2)

我不确定为什么我需要应用上述逻辑来查看泰语字符,即使字符串是 Unicode?在这种情况下,Encoding.Default 到底在做什么?

Kaj*_*Kaj 5

来自 MSDN

以下是Encoding.Default 属性

不同的计算机可以使用不同的编码作为默认编码,并且默认编码甚至可以在单台计算机上更改。因此,从一台计算机传输到另一台计算机或什至在同一台计算机上不同时间检索的数据可能会被错误地转换。此外,由 Default 属性返回的编码使用最佳回退将不支持的字符映射到代码页支持的字符。由于这两个原因,一般不推荐使用默认编码。为确保正确解码编码的字节,您应该使用带有前导码的 Unicode 编码,例如 UTF8Encoding 或 UnicodeEncoding。另一种选择是使用更高级别的协议来确保编码和解码使用相同的格式。

字符串是通过 Encoding.Default 传入的,然后使用 UTF8 解码,所以瓶颈不是 Encoding.Default。它是 Encoding.UTF8 它正在获取字节并将其正确转换为字符串。

即使您尝试在控制台中打印它。看看这两种情况: 在此处输入图片说明 第二行,打印 utf8 配置 您可以通过添加以下行来配置您的控制台以支持 utf8:

Console.OutputEncoding = Encoding.UTF8;
Run Code Online (Sandbox Code Playgroud)

即使使用您的代码:文件中的结果将如下所示: 在此处输入图片说明

使用 Encoding.UTF8 将字符串转换为字节时

var text = "M_M-150 150CC. เดี่ยว (2 For 18 Save 2";
var ascii = Encoding.UTF8.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
Run Code Online (Sandbox Code Playgroud)

结果将是:

在此处输入图片说明

如果您查看Supported Scripts,您会发现UTF8支持所有 Unicode 字符

包括泰语。

请注意,以 Encoding.Default 为例,将无法读取中文或日文,

拿这个例子:

var text = "??";
var ascii = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
Run Code Online (Sandbox Code Playgroud)

这是一个文本文件的输出:

在此处输入图片说明

在这里,如果您尝试将其写入文本,则无法成功转换。

所以你必须使用UTF8读写它

 var text = "??";
 var ascii = Encoding.UTF8.GetBytes(text);
 text = Encoding.UTF8.GetString(ascii);
Run Code Online (Sandbox Code Playgroud)

你会得到这个:

在此处输入图片说明

所以正如我所说,整个过程取决于UTF8而不是默认编码。