【发布时间】:2011-01-03 16:29:59
【问题描述】:
如果我有一个byte b 编码为 ISO Latin 1 (ISO 8859-1) 就足够了
char output = (char)b;这似乎可行,但我不知道是否还有其他方法。
【问题讨论】:
-
我知道 char 是 UTF-8,所以我不确定只是转换它是否可以工作。
如果我有一个byte b 编码为 ISO Latin 1 (ISO 8859-1) 就足够了
char output = (char)b;这似乎可行,但我不知道是否还有其他方法。
【问题讨论】:
直接转换似乎适用于这种特定的编码。但是,最佳做法是使用Encoding.GetChars 方法进行正确转换。
private static readonly Encoding Iso88591 = Encoding.GetEncoding("ISO8859-1");
public static void Main() {
var bytes = new Byte[] { 65 };
var chars = Iso88591.GetChars(bytes);
}
【讨论】:
是的,这应该可以正常工作。如果您查看unicode chart for 8859-1,则 8859-1 和 unicode 之间存在一对一的映射。这意味着您可以将其转换为 char。
但是,并非所有代码页都如此,因此更强大的解决方案可能是个好主意。
【讨论】:
您可以使用 Encoding 类 - 特别是内置的 Encoding.ASCII 从字节数组中获取字符。
尤其是GetChars 重载之一。
【讨论】:
我会使用BitConverter's ToChar。请记住,首先,.NET 中的 char 默认情况下是一个 2 字节的值 - 像这样的简单转换(即使它有效,也可能)并不是最好的主意。
【讨论】:
如果字节的值是=128,那么仅投射可能无法获得正确的角色。
ISO 代码页基本上都是 ASCII,主要区别在于用对代码页。
但是,快速浏览一下 Unicode 代码页就会发现,Latin-1 补充占用了 80-FF 值 (128-255)。所以在这个特定的例子中,你可能没问题,但如果有一些东西,例如,西里尔 ISO 代码页,你必须明确地转换为 Unicode 字符。
【讨论】:
您可以使用Encoding.Convert。
byte[] latin1 = new byte[]{}; // Your data goes here, obviously
byte[] converted = Encoding.Convert(Encoding.GetEncoding("latin1"), Encoding.ASCII, latin1);
然后您可以使用新的字节数组,而不必担心拉丁语 1 是否会给您带来问题。
【讨论】: