将十六进制 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 转义?

从整数转换为其二进制表示

扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物

怎样将unicode编码转换为中文

Java中将字符串与unicode的相互转换工具类

如何将 Unicode 字符转换为十六进制格式的 Unicode 代码点?