将十六进制 unicode 字符转换为其可视化表示
Posted
技术标签:
【中文标题】将十六进制 unicode 字符转换为其可视化表示【英文标题】:Convert hexadecimal unicode character into its visual representation 【发布时间】:2011-09-27 16:52:18 【问题描述】:我正在尝试制作一个将 unicode 字符从其十六进制格式转换为单个字符的 C# 程序,但我遇到了问题。这是我的代码:
这行得通:
char e = Convert.ToChar("\u0066");
但是,这不起作用:
Console.WriteLine("enter unicode format character (for example \\u0066)");
string s = Console.ReadLine();
Console.WriteLine("you entered (for example f)");
char c = Convert.ToChar(s);
因为(Convert.ToChar("\\u0066"))
给出了错误:
字符串的长度必须正好是一个字符
有人知道怎么做吗?
【问题讨论】:
【参考方案1】:int.Parse 不喜欢 "\u" 前缀,但如果您先验证以确保它存在,则可以使用
char c = (char)int.Parse(s.Substring(2), NumberStyles.HexNumber);
这会从输入字符串中去除前两个字符并解析剩余的文本。
为了确保序列是有效的,试试这个:
Regex reg = new Regex(@"^\\u([0-9A-Fa-f]4)$");
if( reg.IsMatch(s) )
char c = (char)int.Parse(s.Substring(2), NumberStyles.HexNumber);
else
// Error
【讨论】:
这也不完全是。它将允许解析\u a
和 \u1234567890
,它们都不是有效的 unicode 字符常量。
确实如此,因此需要先验证输入值。
@Steve:是的!!!!太感谢了!!实际上,验证前两个字符对我来说就足够了,因为如果序列以 \u 开头,它必须是正确的十六进制序列,因为我之前发现了不正确的序列。你拯救了我的一天:)
既然您使用正则表达式捕获了十六进制数字,为什么不使用捕获组(而不是调用子字符串并构建另一个字符串)?而且AllowHexSpecifier
仍然会比HexNumber
更好,忽略空格既没有必要也不可取。
检查规范 - 是的@Ben,我同意!尽管正则表达式将确保不存在空格,但无论如何。【参考方案2】:
Convert.ToChar("\u0066");
在运行时这是一个单字符的字符串,因为编译器处理了反斜杠序列。
您的其余代码处理六个字符串 '\\', 'u', '0', '0', '6', '6'
,Convert.ToChar
无法处理。
尝试char.Parse
(或者可能是Int16.Parse(s, NumberStyles.AllowHexSpecifier)
,然后转换为char
)。
【讨论】:
这些都不起作用,因为 char.parse 仍然只接受单个字符,而 Int16.Parse 不支持 unicode 说明符。 @Steve:嗯,你需要使用正则表达式或类似的方法从字符串中提取十六进制数字。以上是关于将十六进制 unicode 字符转换为其可视化表示的主要内容,如果未能解决你的问题,请参考以下文章
如何将 unicode 字符串转换为其 unicode 转义?