【问题标题】:HTML hex to polish characters用于修饰字符的 HTML 十六进制
【发布时间】:2015-04-29 13:38:50
【问题描述】:

我正在下载带有波兰字符的 HTML 文件,并将其解析为字符串:

public static string HexToString(string hex)
{
    var sb = new StringBuilder();
    for (int i = 0; i < hex.Length; i += 2)
    {
        string hexdec = hex.Substring(i, 2);
        int number = int.Parse(hexdec, NumberStyles.HexNumber);
        char charToAdd = (char)number;
        sb.Append(charToAdd);
    }
    return sb.ToString();
}

所以当我找到 %21 时,我将 21 发送到 HexToString() 并作为回报!,这没关系,但 char ą 表示为 %C4%85 (Ä),我想得到 ą char

【问题讨论】:

  • 这里有问题。 0xC4 不是 UTF8 中的有效字符,在波兰语代码页 (852) 中是 。代码页 852 中 ą 的代码是 0xA5
  • 你说得对,ą char 发送为 %C4%85,而不仅仅是 %C4

标签: c# html hex


【解决方案1】:

这里的问题是您将十六进制代码视为 UTF16(这是 char 的本机格式),但它们实际上是 UTF8。

这很容易使用 UTF8 编码解决。

首先,让我们编写一个方便的StringToByteArray() 方法:

public static byte[] StringToByteArray(string hex)
{
    return Enumerable.Range(0, hex.Length)
        .Where(x => x%2 == 0)
        .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
        .ToArray();
}

现在您可以像这样将十六进制字符串转换为文本:

string hexStr = "C485"; // Or whatever your input hex string is.

var bytes = StringToByteArray(hexStr);
string text = Encoding.UTF8.GetString(bytes);

// ...use text

【讨论】:

    【解决方案2】:

    Matthew 是对的,但你也可以这样用:

            public static string ConvertHexToString(string HexValue)
            {
                var res = "";
                var replacedHex = HexValue.Replace("%", String.Empty);
                while (replacedHex.Length > 0)
                {
                    res += System.Convert.ToChar(System.Convert.ToUInt32(replacedHex.Substring(0, 2), 16)).ToString();
                    replacedHex = replacedHex.Substring(2, replacedHex.Length - 2);
                }
                return res;
            }
    

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 2013-06-29
      • 1970-01-01
      • 2019-07-27
      • 2018-01-31
      • 2010-10-04
      • 2012-02-23
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多