将未转义的unicode字符串转换为unicode

时间:2019-01-25 14:29:38

标签: c# unicode

我有一个来自mysql数据库的文本字符串

var str = "u0393u03a5u039du0391u0399u039au0391".

我想替换unicode字符以将其显示为实际出现的“ΓΥΝΑΙΚΑ”。如果我在.net中用\ u手动转义了u,则转换将自动完成。

我发现了以下功能:

byte[] unicodeBytes = Encoding.Unicode.GetBytes(str);

// Perform the conversion from one encoding to the other.
byte[] ascibytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes);

// Convert the new byte[] into a char[] and then into a string.
char[] asciiChars = new char[Encoding.ASCII.GetCharCount(ascibytes, 0, ascibytes.Length)];

Encoding.ASCII.GetChars(ascibytes, 0, ascibytes.Length, asciiChars, 0);
return new string(asciiChars);

但是由于必须逃脱,我愿意

str =str.Replace("u", @"\u")

但是没有运气。我该如何转换呢?

2 个答案:

答案 0 :(得分:2)

这些本质上是UTF-16代码点,因此可以做到(这种方法效率不高,但是我认为优化不是主要目标):

Regex.Replace(
    "u0393u03a5u039du0391u0399u039au0391",
    "u[0-9a-f]{4}",
    m => "" + (char) int.Parse(m.Value.Substring(1), NumberStyles.AllowHexSpecifier)
)

这不能处理字符串中未转义的“常规”字符的歧义:dufface将有效地变成d + \uffac + e ,这可能不正确。它会正确处理代理(尽管ud83dudc96是)。

使用this answer中的技术是另一种选择:

Regex.Unescape(@"u0393u03a5u039du0391u0399u039au0391".Replace(@"\", @"\\").Replace("u", @"\u"))

额外的\转义是为了防止该字符串已经包含任何反斜杠,这可能被错误地解释为转义序列。

答案 1 :(得分:0)

另一种方式:

var str = "u0393u03a5u039du0391u0399u039au0391";

if (str.Length > 0 && str[0] == 'u')
    str = str.Substring(1, str.Length - 1);

string chars = string.Concat(str.Split('u').Select(s => 
    Convert.ToChar(Convert.ToInt32("0x" + s,16))));