2

我尝试在 Java 中为重读元音键入 char 文字,但编译器会说类似:未闭合字符文字

这就是我想要做的:

 char [] a = {'à', 'á', 'â', 'ä' };

我尝试使用 Unicode '\u00E0',但由于某种原因,它们与我的代码不匹配:

 for( char c : string.toCharArray() ) {
     if( c == a[i] ) {
         // I've found a funny letter 
     }
 }

if无论我在字符串中放什么,都不会评估为真。

这是我正在尝试编码的完整程序。

4

5 回答 5

6

代码应使用正确的编码进行编译:

javac -encoding UTF-8 Foo.java

那里会有编码不匹配的地方。

public class Foo {
  char [] a = {'à', 'á', 'â', 'ä' };  
}

上面保存为 UTF-8 的代码应该成为十六进制转储:

70 75 62 6C 69 63 20 63 6C 61 73 73 20 46 6F 6F         public class Foo
20 7B 0D 0A 20 20 63 68 61 72 20 5B 5D 20 61 20          {__  char [] a
3D 20 7B 27 C3 A0 27 2C 20 27 C3 A1 27 2C 20 27         = {'__', '__', '
C3 A2 27 2C 20 27 C3 A4 27 20 7D 3B 20 20 0D 0A         __', '__' };  __
7D 0D 0A 0D 0A                                          }____

代码点 U+00E0 (à) 的 UTF-8 值为C3 A0.

代码应使用正确的编码进行编译:

javac -encoding UTF-8 Foo.java

有一个外部机会,à 将由组合序列 U+0061 U+0300 表示。这是NFD表单(我从未遇到过将其用作文本输入默认值的文本编辑器)。正如Thorbjørn Ravn Andersen 指出的那样,总是使用 \uXXXX 转义序列通常会更好 - 它不那么模棱两可。

您还需要检查您的输入设备(文件/控制台/等)

作为最后的手段,您可以将您char的 s 转储为十六进制System.out.format("%04x", (int) c);并尝试使用字符检查器手动解码它们以找出它们是什么。

于 2009-12-21T21:45:40.323 回答
5

要使 Unicode 字符起作用,您必须确定 javac 以与写入时相同的编码方式读取它。

只需使用 \uXXXX 符号,您就可以省去很多麻烦。

于 2009-12-21T20:29:06.890 回答
1

查找 Unicode 字符值,并使用\uxxxx.

U+00e 是带有重音的 a,例如

char aacute = '\u00e1';

下一个问题是你的字符串是从哪里来的。你确定它有这些字符?作为组合字符?最好用十六进制打印出来看看。

您可能需要规范化(在 Java 1.6 或使用 icu4j 中)。

于 2009-12-21T20:24:24.437 回答
1

在快速测试中,这似乎对我有用:

static char [] a = {'à', 'á', 'â', 'ä' };


    public static boolean foundMatch(String s){

        boolean test = false;
        for(int i=0;i < a.length;i++){
            String t = String.valueOf(a[i]);
            test = s.contains(t);
            if (test) return true;
    }
        return test;
    }
于 2009-12-21T20:41:02.547 回答
1

你没有提到你需要完成什么(即为什么你需要在字符串中找到重音字符),我会冒险猜测你需要做的不仅仅是检查一段输入中是否存在重音字符. 冒着告诉你一些你已经知道的事情的风险:

  • 如果您需要从文本字符串中过滤掉它们,我建议您使用白名单而不是黑名单。
  • 如果您需要按字母顺序对它们进行排序而不考虑重音,请使用java.text.Collat​​or而不是自己滚动的系统。
  • 如果您需要将重音字符替换为它们的“基本”字符,则Collat​​or应该再次提供帮助(其中的分解内容),但我以前没有这样做过,所以我无法告诉你如何这样做确切地。
于 2009-12-21T20:48:20.563 回答