【问题标题】:Check contents of UTF-8 string检查 UTF-8 字符串的内容
【发布时间】:2013-06-01 16:06:44
【问题描述】:

我有一个原始字符串:

String originalStr = "Đây là chuỗi gốc";

我还有另一个字符串:

String str1 = "Đây";

String str2 = "Day";

我想检查字符串 str1 和 str2 是否包含在 originalStr 中。 有什么想法吗?

感谢所有cmets;

我修好了。关注代码:

public String convertUTF8String(String _originalString){
    String resultString = StringUtils.stripAccents(_originalString);
    return resultString.replace('Đ', 'D').replace('đ', 'd');
}

注意:导入 org.apache.commons.lang3.StringUtils;

您可以下载Commons Langhere

【问题讨论】:

    标签: java utf-8


    【解决方案1】:

    如果您使用 UTF-8 编码编写并保存 .java 文件,那么您可以使用简单的字符串 contains 方法,这是我运行的示例:

       public static void main (String args[]) {
        String originalStr = "Đây là chuỗi gốc"; 
        String str1 = "Đây";
        String str2 = "Day";
        System.out.println(originalStr.contains(str1));
        System.out.println(originalStr.contains(str2));
    }
    

    这是正确的输出:

    是的

    评论后编辑

    它们都是两个不同的字符串,因此结果是真假。 Java 不具备翻译字符串和比较的智能。 "Đây" 和 "Day" 是两个不同的字符串,尽管它们具有相同的含义。如果你想实现它们都相同,那么你应该编写一个方法来翻译字符串然后进行比较。在这种情况下,两个字符串的含义将相同,因此结果将为真。或者,您可以使用自己的方法 translateAndCompare 来实现所需的结果。

    【讨论】:

    • @TranQuocHung 我已经更新了分辨率,因为我的评论太长了,这里放不下。
    • 感谢您的回答。但这对我不好。我已经在 anwser 中编辑了这个问题。以后可能会对你有所帮助!!!
    【解决方案2】:

    要测试一个字符串是否包含在另一个没有变音符号的字符串中,您可以使用 Apache common lang :http://commons.apache.org/proper/commons-lang//apidocs/org/apache/commons/lang3/StringUtils.html#stripAccents%28java.lang.String%29

    public boolean isStringContained(String src, String sub) {
      sub = StringUtils.stripAccents(sub);
      src = StringUtils.stripAccents(src)
      return src.contains(sub);
    }
    

    然后你就可以使用函数了:

    isStringContained("Đây là chuỗi gốc", "Đây"); // returns true
    isStringContained("Đây là chuỗi gốc", "Day"); // returns true
    

    【讨论】:

      【解决方案3】:

      最安全的方法可能是去除字符串中的所有重音符号并以这种方式进行比较。例如:

      Pattern ACCENTS_PATTERN = Pattern.compile( "[\\p{InCombiningDiacriticalMarks}]+" );
      String originalStr = "Đây là chuỗi gốc";
      String str1 = "Đây";
      String str2 = "Day";
      
      System.out.println( "Is str1 in originalStr? : " + originalStr.contains( str1 ) );
      System.out.println( "Is str2 in originalStr? : " + originalStr.contains( str2 ) );
      
      String originalNorm = ACCENTS_PATTERN.matcher( 
          Normalizer.normalize( originalStr, Normalizer.Form.NFD ) )
              .replaceAll( "" );
      
      System.out.println( "The normalized string is " + originalNorm );
      

      不幸的是,这并不能完全让你到达那里,因为输出如下:

      Is str1 in originalStr? : true
      Is str2 in originalStr? : false
      The normalized string is Đay la chuoi goc
      

      如您所见,第一个 D 中仍有一个破折号。但是,如果您可以确定该字母所属的 Unicode 组,那么您可以将其添加到 ACCENTS_PATTERN,希望这会起作用.

      【讨论】:

      • 恐怕不是,因为我不知道它属于哪个 Unicode 组。如果你能找到它并将其添加到 ACCENTS_PATTERN,那么你可能会走得更远。
      猜你喜欢
      • 2014-03-18
      • 2019-12-16
      • 2018-09-07
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2016-08-14
      • 2018-09-03
      相关资源
      最近更新 更多