【问题标题】:ISO latin 1 byte to charISO 拉丁文 1 字节转字符
【发布时间】:2011-01-03 16:29:59
【问题描述】:

如果我有一个byte b 编码为 ISO Latin 1 (ISO 8859-1) 就足够了 char output = (char)b;这似乎可行,但我不知道是否还有其他方法。

【问题讨论】:

  • 我知道 char 是 UTF-8,所以我不确定只是转换它是否可以工作。

标签: c# string encoding


【解决方案1】:

直接转换似乎适用于这种特定的编码。但是,最佳做法是使用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);
}

【讨论】:

    【解决方案2】:

    是的,这应该可以正常工作。如果您查看unicode chart for 8859-1,则 8859-1 和 unicode 之间存在一对一的映射。这意味着您可以将其转换为 char。

    但是,并非所有代码页都如此,因此更强大的解决方案可能是个好主意。

    【讨论】:

    • 不正确。 ASCII 和 UTF-8 之间存在一对一的映射。其他 Unicode 格式(比如 UTF-16)不会以这种方式映射。
    • 这接近准确。太糟糕了,有不止一个 8859-1 标准。典型的 ISO 损失。
    【解决方案3】:

    您可以使用 Encoding 类 - 特别是内置的 Encoding.ASCII 从字节数组中获取字符。

    尤其是GetChars 重载之一。

    【讨论】:

      【解决方案4】:

      我会使用BitConverter's ToChar。请记住,首先,.NET 中的 char 默认情况下是一个 2 字节的值 - 像这样的简单转换(即使它有效,也可能)并不是最好的主意。

      【讨论】:

      • ISO-Latin-1 是单字节,我用 0 填充它吗?
      【解决方案5】:

      如果字节的值是=128,那么仅投射可能无法获得正确的角色。

      ISO 代码页基本上都是 ASCII,主要区别在于用对代码页。

      但是,快速浏览一下 Unicode 代码页就会发现,Latin-1 补充占用了 80-FF 值 (128-255)。所以在这个特定的例子中,你可能没问题,但如果有一些东西,例如,西里尔 ISO 代码页,你必须明确地转换为 Unicode 字符。

      【讨论】:

        【解决方案6】:

        您可以使用Encoding.Convert

                byte[] latin1 = new byte[]{}; // Your data goes here, obviously
                byte[] converted = Encoding.Convert(Encoding.GetEncoding("latin1"), Encoding.ASCII, latin1);
        

        然后您可以使用新的字节数组,而不必担心拉丁语 1 是否会给您带来问题。

        【讨论】:

          猜你喜欢
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 2013-09-05
          • 2013-10-25
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          • 2013-01-19
          相关资源
          最近更新 更多