我尝试在 Java 中输入重音元音的 char 文字,但编译器会说: 未封闭的字符文字

这就是我想做的:

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

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

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

if 无论我在字符串中放入什么,都不会计算为 true。

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

有帮助吗?

解决方案

代码应与正确的编码被编译:

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(A)中的UTF-8值是C3 A0

代码应与正确的编码被编译:

javac -encoding UTF-8 Foo.java

有一个外部的机会,一个将通过组合序列U + 0061 U + 0300来表示。这是 NFD 形式(I”以前从来没有碰到过的是将其作为文本输入默认的)文本编辑器。由于托尔比约恩Ravn的安德森指出出来,通常最好总是使用为\ uXXXX转义序列 - 它是更加明确

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

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

其他提示

有关Unicode字符工作,你必须确定的javac在它被写入相同的编码读取它。

您将仅使用为\ uXXXX记号为自己省下不少麻烦。

查找Unicode字符值,和形式\uxxxx的使用文字。

U + 00E是一个具有重音符,e.g。

char aacute = '\u00e1';

接下来的问题是你的字符串是从哪里来的。你肯定有这些字符?由于组成字符?更好的打印出来的一些十六进制看看吧。

您可能需要正常化(在Java 1.6的或ICU4J)。

这似乎为我快速测试工作:

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;
    }

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

  • 如果您需要从文本字符串中过滤掉它们,我建议您使用白名单而不是黑名单。
  • 如果您需要按字母顺序对它们进行排序而不考虑重读,请使用 java.text.Collat​​or 而不是自行部署系统。
  • 如果您需要用“基本”字符替换重音字符,则 校订者 应该再次有帮助(其中的分解内容),但我以前没有这样做过,所以我不能告诉你到底如何做。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top