在C#中处理unicode和ASCII字符集

时间:2011-01-05 08:24:47

标签: c# string encoding

我在C#应用程序中有这个映射

string [,] unicode2Ascii = { { "ஹ", "\x86" } };

ஹ - 是泰米尔文字的unicode值"ஹ"。这是MS Word作为字节序列保存的unicode值的原始十六进制文字。我试图映射这些unicode值"字符串"到255以下的十六进制值(以便适应非unicode支持的系统)。

我试图像这样使用string.replace:

S = S.replace(unicode2Ascii[0,0], unicode2Ascii[0,1]);

然而,由此产生的输出有一个?而不是存储的实际十六进制0x86。关于如何将该数组的第二个元素的编码设置为类似于windows-1252的任何指针?

或者有更好的方法进行此转换吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

不确定这是否有帮助,但Windows支持泰米尔语代码页“57004 - ISCII Tamil”。

虽然它没有为上面的示例字符提供相同的翻译。对于'ஹ',它给出了216.也许需要使用不同的代码页?

        string tamilUnicodeString = "ஹ";

        Encoding encoding = Encoding.GetEncoding("x-iscii-ta");

        byte[] codepageBytes = encoding.GetBytes(tamilUnicodeString);

<强>更新

如果您希望将unicode文件作为输入,音译字符以获得单字节表示,以下应该可以解决问题。如果字典对每个字符进行编码,则生成的数组应具有单字节表示形式:

        Dictionary<char, char> lookup = new Dictionary<char, char>
        {
            { 'ஹ', '\x86' },
            { 'இ',  '\x87' },
            //next pair...,
            //etc, etc.
        };

        string input = "ஹஇதில் உள்ள தமிழ் எழுத்துக்கள் சரியாகத் தெரிந்தால்";

        char[] chars = input.ToCharArray();

        for (int i = 0; i < chars.Length; i++)
        {
            char replaceChar;

            if (lookup.TryGetValue(chars[i], out replaceChar))
            {
                chars[i] = replaceChar;
            }
        }

        byte[] output = Encoding.GetEncoding("iso-8859-1").GetBytes(chars);

答案 1 :(得分:3)

.NET中的字符串在内部始终是Unicode。然而,这并不重要。字符串是一系列字符,.NET字符串支持所有unicode字符。你不应该关心它们是如何呈现在记忆中的。只有当你的字符串离开(或输入).NET时(即当你将它们写入(读取)文件,通过套接字发送(接收)到其他系统等)时,你才关心编码。这是当您使用Encoding类转换为您想要的任何编码时。替换字符或尝试.NET字符串上的任何编码技巧是没有意义的。 我还推荐这篇文章http://www.joelonsoftware.com/articles/Unicode.html