从转义ASCII码序列读取UTF8 / UNICODE字符(Read UTF8/UNICODE ch

2019-08-03 16:54发布

我有一个文件下面的名字,我需要阅读的字符串作为一个UTF8编码的字符串,所以从这个:

test_\303\246\303\270\303\245.txt

我需要获取以下信息:

test_æøå.txt

你知道如何实现这一目标使用C#?

Answer 1:

假设你有这样的字符串:

string input = "test_\\303\\246\\303\\270\\303\\245.txt";

IE字面上

test_\303\246\303\270\303\245.txt

你可以这样做:

string input = "test_\\303\\246\\303\\270\\303\\245.txt";
Encoding iso88591 = Encoding.GetEncoding(28591); //See note at the end of answer
Encoding utf8 = Encoding.UTF8;


//Turn the octal escape sequences into characters having codepoints 0-255
//this results in a "binary string"
string binaryString = Regex.Replace(input, @"\\(?<num>[0-7]{3})", delegate(Match m)
{
    String oct = m.Groups["num"].ToString();
    return Char.ConvertFromUtf32(Convert.ToInt32(oct, 8));

});

//Turn the "binary string" into bytes
byte[] raw = iso88591.GetBytes(binaryString);

//Read the bytes into C# string
string output = utf8.GetString(raw);
Console.WriteLine(output);
//test_æøå.txt

通过“二进制串”,我的意思是只包含与代码点0-255字符的字符串。 因此,它相当于一个穷人的byte[]你在哪里指数检索字符的代码点i ,而不是一个byte的值byte[]索引i (这是我们在JavaScript几年前所做的那样)。 由于ISO-8859-1地图恰好前256个Unicode码点为一个字节,这是一个完美的“二进制串”转换为byte[]



文章来源: Read UTF8/UNICODE characters from an escaped ASCII sequence