0

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

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

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

// notice the thai character เดี่ยว in the string M_M-150 150CC. เดี่ยว (2 For 18 Save 2)

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

4

1 回答 1

5

来自 MSDN

这是Encoding.Default 属性

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

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

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

Console.OutputEncoding = Encoding.UTF8;

即使使用您的代码:文件中的结果也将如下所示: 在此处输入图像描述

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

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

结果将是:

在此处输入图像描述

如果您查看支持的脚本,您会发现UTF8支持所有 Unicode 字符

包括泰语。

请注意,例如 Encoding.Default 将无法阅读中文或日文,

举个例子:

var text = "漢字";
var ascii = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);

这是文本文件的输出:

在此处输入图像描述

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

所以你必须使用 UTF8 读写它

 var text = "漢字";
 var ascii = Encoding.UTF8.GetBytes(text);
 text = Encoding.UTF8.GetString(ascii);

你会得到这个:

在此处输入图像描述

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

于 2018-06-20T16:04:24.453 回答