【问题标题】:Invalid character constant in a UTF-8 characterUTF-8 字符中的字符常量无效
【发布时间】:2012-05-02 23:01:30
【问题描述】:

我正在尝试将 'o͝'(语音字符)分配给 Java 程序中的字符,但我收到错误“无效字符常量”。我的文件使用 UTF-8 和其他拼音字符可以正常工作,但不是这个。看起来这个字符实际上是两个(一个“o”和一个连字或类似的东西),但我无法打破它正在形成的部分。

代码示例:

Character test = 'o͝';

任何帮助将不胜感激。

【问题讨论】:

    标签: java character-encoding


    【解决方案1】:

    您可以尝试查看字符表上的字符编号并将其分配给变量,例如:

    char a = '\u0040';
    

    【讨论】:

    • 这绝对是正确的做法。将晦涩的字符从字面上包含到您的文字中总是会让您受制于存储代码的文件系统以及编译它的环境\uXXXX 转义始终有效并且可以处理 Unicode 中的任何字符
    • 很可能你的 "char" 实际上是两个,第二个是组合变音字符,所以你必须使用 String a = "o͝",或者使用 int 代码点使用单字符版本。
    • 是的,它看起来是一个组合变音字符,所以我在表格中找不到组合字符。在使用十六进制编辑器并解码 UTF-8 值后,我发现它们是 U+006F('o')和 U+035D(COMBINING DOUBLE BREVE)。谢谢。
    【解决方案2】:

    字形被称为“带有combining double breve 的小写字母o”,在源代码中可以写成;

    String a = "\u006f\u035d";
    

    由于它是一个组合字符(即两个字符),因此不能将结果值分配给单个 Java 字符,您需要使用字符串。

    【讨论】:

    • 第二个字符不应该是“\u035d”吗?
    • 谢谢,我在你回复的同时找到了。而且,是的,它是 U+035D。
    • @erikxiv 是的,谢谢,你是对的,我将 utf-8 值与代码点混淆了。编辑修复。
    【解决方案3】:

    如前所述,你不应该硬编码这样的字符,你应该使用这里找到的 unicode 点值:

    http://www.utf8-chartable.de/

    你想要的实际上涉及一个“组合字符”:

    http://en.wikipedia.org/wiki/Combining_character

    组合变音符号是 0x0300 - 0x036f。因此,例如,要创建您想要的字符('o' 带双短号),请使用:

    String o_doubleBreve = "o\u035d";
    

    打印为o͝

    【讨论】:

      【解决方案4】:

      我同意上述答案,即在您编写的任何新代码中最好使用 \u 表示,但是您会遇到源代码存在此问题的项目,并且 据说他们能够编译他们的代码。我现在正在使用的一个这样的例子是openNLP

      好吧,如果您遇到这样的情况,您会发现,在 Eclipse 等 IDE 中运行时,如果您遵循this 之类的过程,您可以将工作区默认表示更改为 UTF-8。这将允许成功编译代码。

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 2010-11-28
        • 2023-03-23
        • 2020-03-07
        • 2011-04-22
        • 2018-07-28
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多