在 c# 中如何将 unicode 字符转换回 UTF-8?
In c# How to convert back unicoded characters to UTF-8?
我有此文本 Grou00dfbeerenstrau00dfe
,我需要将其转换为 Großbeerenstraße
还有 Eichstu00e4tt
到 Eichstätt
但由于这些原因,我没有完全理解和解决这个问题:
- 只转换部分字符(特殊字符),而不是整个文本
- Unicoded 文本通常使用转义字符
\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"));
实际上,它会检查 u0
以防止接下来的 4 个字符是有效的 unicode,但不应该被替换的情况。这至少适用于德语,因为德语中的所有特殊字符都有以 0
.
开头的 unicode 代码
这也将捕捉以下 4 位数字是有效的十六进制数字,但生成的十六进制数字不是有效的 unicode 字符的情况。
虽然我完全同意@Gabriel Luci 的回答,但我想指出相同想法的更简洁的实现(它需要“System.Text.RegularExpression”命名空间):
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;
}
});
}
我有此文本 Grou00dfbeerenstrau00dfe
,我需要将其转换为 Großbeerenstraße
还有 Eichstu00e4tt
到 Eichstätt
但由于这些原因,我没有完全理解和解决这个问题:
- 只转换部分字符(特殊字符),而不是整个文本
- Unicoded 文本通常使用转义字符
\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"));
实际上,它会检查 u0
以防止接下来的 4 个字符是有效的 unicode,但不应该被替换的情况。这至少适用于德语,因为德语中的所有特殊字符都有以 0
.
这也将捕捉以下 4 位数字是有效的十六进制数字,但生成的十六进制数字不是有效的 unicode 字符的情况。
虽然我完全同意@Gabriel Luci 的回答,但我想指出相同想法的更简洁的实现(它需要“System.Text.RegularExpression”命名空间):
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;
}
});
}