c# - 将 Windows-1252 字符串与 UTF-8 字符串进行比较

标签 c# string character-encoding windows-1252

我的目标是将 .NET 字符串 (Unicode) 转换为 Windows-1252,并在必要时将原始 UTF-8 字符串存储在 Base64 实体中。

例如,字符串“DJ Doena”转换为 1252 仍然是“DJ Doena”。

但是,如果将表示树(木)的日语汉字转换为 1251,则会出现一个问号。

这些是我的测试字符串:

String doena = "DJ Doena";
String umlaut = "äöüßéèâ";
String allIn = "< ä ß á â & 木 >";

这就是我首先转换字符串的方式:

using (MemoryStream ms = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
    {
        sw.Write(decoded);
        sw.Flush();
        ms.Seek(0, SeekOrigin.Begin);
        using (StreamReader sr = new StreamReader(ms, Encoding.GetEncoding(1252)))
        {
            encoded = sr.ReadToEnd();
        }
    }
}

问题是,在调试字符串比较时声称两者确实相同,因此简单的 ==.Equals() 是不够的。

这就是我尝试找出是否需要 base64 并生成它的方法:

private static String GetBase64Alternate(String utf8Text, String windows1252Text)
{
    Byte[] utf8Bytes;
    Byte[] windows1252Bytes;
    String base64;

    utf8Bytes = Encoding.UTF8.GetBytes(utf8Text);
    windows1252Bytes = Encoding.GetEncoding(1252).GetBytes(windows1252Text);
    base64 = null;
    if (utf8Bytes.Length != windows1252Bytes.Length)
    {
        base64 = Convert.ToBase64String(utf8Bytes);
    }
    else
    {
        for(Int32 i = 0; i < utf8Bytes.Length; i++)
        {
            if(utf8Bytes[i] != windows1252Bytes[i])
            {
                base64 = Convert.ToBase64String(utf8Bytes);
                break;
            }
        }
    }
    return (base64);
}

第一个字符串 doena 完全相同,不会产生 Base64 结果

Console.WriteLine(String.Format("{0} / {1}", windows1252Text, base64Text));

结果

DJ Doena /

但是第二个字符串 umlauts 的字节数在 UTF-8 中已经是 1252 中的两倍,因此会生成一个 Base64 字符串,尽管它似乎没有必要:

äöüßéèâ / w6TDtsO8w5/DqcOow6I=

第三个做了它应该做的事情(不再是“木”而是一个“?”,因此需要base64):

< ä ß á â & ? > / PCDDpCDDnyDDoSDDoiAmIOacqCA+

有什么线索可以增强我的 Base64 getter a) 性能 b) 以获得更好的结果吗?

提前谢谢您。 :-)

最佳答案

我不确定我是否完全理解了这个问题。但我尝试过。 :) 如果我理解正确的话,这段代码可以实现你想要的功能:

static void Main(string[] args)
{
    string[] testStrings = { "DJ Doena", "äöüßéèâ", "< ä ß á â & 木 >" };

    foreach (string text in testStrings)
    {
        Console.WriteLine(ReencodeText(text));
    }
}

private static string ReencodeText(string text)
{
    Encoding encoding = Encoding.GetEncoding(1252);
    string text1252 = encoding.GetString(encoding.GetBytes(text));

    return text.Equals(text1252, StringComparison.Ordinal) ?
        text : Convert.ToBase64String(Encoding.UTF8.GetBytes(text));
}

即它将文本编码为 Windows-1252,然后解码回 string 对象,然后与原始文本进行比较。如果比较成功,则返回原始字符串,否则将其编码为UTF8,然后再编码为base64。

它产生以下输出:

DJ Doena
äöüßéèâ
PCDDpCDDnyDDoSDDoiAmIOacqCA+

换句话说,前两个字符串保持不变,而第三个字符串则编码为 base64。

关于c# - 将 Windows-1252 字符串与 UTF-8 字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27511937/

相关文章:

c# - asp.net mvc Binder 不更新编辑 View 中的 RoleId 值

c# - 通过 LINQ 解析 XML 时出现空引用异常

c++ - 为什么 std::string 没有大小写、格式等方法?

php - 如何列出具有特殊(挪威语)字符的文件

Java 字符串的 native 字符集

c# - 如何在 C# 中动态引用递增的属性?

c# - 使用 MsBuild 4.0 编译的程序集是否与只有 .NET 3.5 的计算机兼容?

c++ - std::string.npos 有效性

json - 在不使用结构的情况下将 json 转换为 map slice 并将 map slice 转换为 json

php - PHP/Mysql 具有不同的字符格式