在c#中,如何将Unicode字符转换回UTF-8?
我有这个文本在c#中,如何将Unicode字符转换回UTF-8?,c#,unicode,utf-8,C#,Unicode,Utf 8,我有这个文本Grou00dfbeerenstrau00dfe,我需要将它转换成Großbeerenstrae 同时Eichstu00e4tt至EICHSTTätt 但我并没有完全理解和解决这个问题,原因如下: 仅转换部分字符(特殊字符),而不是整个文本 未编码文本通常具有转义字符,如\u00df,而不是u00df 你能帮我把它正确地转换回原来的状态吗? 基本上,当没有转义字符时,如何转换 注意:如果你一定要知道,我正在向某个系统发送一些特殊的字符字符串。我无法触摸这个系统,但当我请求从该系统返
Grou00dfbeerenstrau00dfe
,我需要将它转换成Großbeerenstrae
同时Eichstu00e4tt
至EICHSTTätt
但我并没有完全理解和解决这个问题,原因如下:
\u00df
,而不是u00df
注意:如果你一定要知道,我正在向某个系统发送一些特殊的字符字符串。我无法触摸这个系统,但当我请求从该系统返回相同的字符串时,它会将
Großbeerenstraße
转换为Grou00dfbeerenstrau00dfe
,依此类推。基于David查找u
并检查以下4个字符是否为有效的十六进制数的想法,它看起来是这样的:
public string FixGermanUnicode(string input) {
var output = new StringBuilder();
for (var i = 0; i < input.Length; i++) {
if (i < input.Length - 4 && input[i] == 'u' && input[i + 1] == '0'
&& int.TryParse(input.Substring(i + 1, 4), NumberStyles.HexNumber, null, out var code)) {
try {
output.Append(char.ConvertFromUtf32(code));
i += 4;
} catch (ArgumentOutOfRangeException) {
//not a valid unicode character
output.Append(input[i]);
}
} else {
output.Append(input[i]);
}
}
return output.ToString();
}
Console.WriteLine(FixGermanUnicode("Grou00dfbeerenstrau00dfe"));
公共字符串FixGermanUnicode(字符串输入){
var输出=新的StringBuilder();
对于(变量i=0;i
实际上,它会检查u0
,以防止接下来的4个字符是有效的unicode字符,但不应该被替换。这至少适用于德语,因为德语中的所有特殊字符都有以0
开头的unicode代码
这还将捕获以下情况:以下4位数字是有效的十六进制数,但生成的十六进制数不是有效的unicode字符。虽然我完全同意@Gabriel Luci的回答,但我想指出相同想法的一个更简洁的实现(它需要“System.Text.RegularExpression”命名空间):
它不是
00df
,但是它是u00df
,因此u
仍然存在,但是\已经被剥离。不幸的是,这使字符串变得模棱两可,但我将首先查找每个u
,并检查以下4个字符是否为有效的十六进制数。您是正确的,它是u00df,但没有excape字符
readonly static string unicodePattern = @"u0[0-9a-fA-F]{3}";
public static string FixGermanUnicode(string input)
{
return Regex.Replace(input, unicodePattern, match =>
{
var digits = match.Value.Substring(1);
try
{
return char.ConvertFromUtf32(int.Parse(digits, System.Globalization.NumberStyles.AllowHexSpecifier)).ToString();
}
catch (ArgumentOutOfRangeException)
{
//not a valid unicode character
return match.Value;
}
});
}