【问题标题】:Unicode to string conversion in JavaJava中的Unicode到字符串转换
【发布时间】:2010-12-28 10:28:22
【问题描述】:

我正在构建一种语言,一种玩具语言。语法 \#0061 应该将给定的 Unicode 转换为字符:

String temp = yytext().subtring(2);

然后尝试将'\u' 附加到字符串后,我注意到产生了错误。

我也试过"\\" + "u" + temp;这种方式不做任何转换。

我基本上是在尝试通过仅向方法提供 '0061' 来将 Unicode 转换为字符,帮助。

【问题讨论】:

  • 请注意,16 位(4 个十六进制数字)不足以表示 Unicode 中的所有字符。在java中“\u1234”映射到UTF-16中的一个码位单元,它与一个字符不同。
  • 附录:事实上它是映射到 UTF-16 代码点单元的 java 数据类型 char,而不是实际的 Unicode 字符。

标签: java unicode string


【解决方案1】:

\uXXXX 是一个转义序列。在执行之前,它已经被转换为实际的字符值,在运行时无论如何都不会“评估”。

您可能想要做的是定义从 #XXXX 语法到 Unicode 代码点的映射,并将它们转换为 char

【讨论】:

    【解决方案2】:

    去掉“#”并使用Integer.parseInt("0061", 16) 将十六进制数字转换为int。然后转换为char

    (如果您手动实现了词法分析器,另一种方法是在您的词法分析器与 unicode 文字匹配时即时进行转换。但是在重新阅读问题时,我发现您正在使用词法分析器生成器......好动作!)

    【讨论】:

    • 只是好奇:您是如何发现他在使用词法分析器的?
    • @BalusC 因为 yytext,一个 lex 特定的变量
    【解决方案3】:

    您需要将特定代码点转换为char。您可以通过正则表达式的一点帮助来做到这一点:

    String string = "blah #0061 blah";
    
    Matcher matcher = Pattern.compile("\\#((?i)[0-9a-f]{4})").matcher(string);
    while (matcher.find()) {
        int codepoint = Integer.valueOf(matcher.group(1), 16);
        string = string.replaceAll(matcher.group(0), String.valueOf((char) codepoint));
    }
    
    System.out.println(string); // blah a blah
    

    编辑根据 cmets,如果它是单个令牌,那么只需:

    String string = "0061";
    char c = (char) Integer.parseInt(string, 16);
    System.out.println(c); // a
    

    【讨论】:

    • Erm ...您不想使用 Java 正则表达式模式匹配来实现词法分析器。
    • 我需要您发布的第一个示例。我根据需要运行了使模式更改的代码,但是 ReplaceAll 不会替换任何内容。该字符串与原始字符串相同 :(
    • @Eric:按右上角的 按钮,提出您想获得答案的问题。
    【解决方案4】:

    我基本上是在尝试转换 通过提供 unicode 到一个字符 只有 '0061' 到一个方法,帮助。

    char fromUnicode(String codePoint) {
      return (char)  Integer.parseInt(codePoint, 16);
    }
    

    您需要处理错误的输入等,但否则会起作用。

    【讨论】:

      猜你喜欢
      • 2016-03-26
      • 2017-03-03
      • 1970-01-01
      • 2014-04-14
      • 2023-03-25
      • 2016-11-04
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多