Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用除重音字符外的Java字符串的大写字母_Java_String_Special Characters - Fatal编程技术网

如何使用除重音字符外的Java字符串的大写字母

如何使用除重音字符外的Java字符串的大写字母,java,string,special-characters,Java,String,Special Characters,我有一个webapp,它调用一个webservice,传递一个字符串参数(一个名称),该参数是大写格式的,可以包含重音大写字符。 另一方面,服务器webapp不管理此类字符 然后,客户端webapp只能使用小写重音字符(例如:CLéMENT>CLéMENT) 您知道一种快速(使用utils?)方法/方法组合来实现此目的,而无需将字符串转换为字符表吗?请阅读此处接受的答案: 如果您将toUpperCase与区域设置一起使用,则应遵守重音字符。否,看起来您必须将字符串转换为char[]并从那里开始工

我有一个webapp,它调用一个webservice,传递一个字符串参数(一个名称),该参数是大写格式的,可以包含重音大写字符。 另一方面,服务器webapp不管理此类字符

然后,客户端webapp只能使用小写重音字符(例如:CLéMENT>CLéMENT)


您知道一种快速(使用utils?)方法/方法组合来实现此目的,而无需将字符串转换为字符表吗?

请阅读此处接受的答案:


如果您将toUpperCase与区域设置一起使用,则应遵守重音字符。

否,看起来您必须将字符串转换为
char[]
并从那里开始工作。试着这样做:

public static String convert(String in) {

    // put in the string the accented characters to be converted
    final String accented = "ÁÉÍÓÚ";
    char[] outChars = in.toCharArray();

    for (int i = 0, n = outChars.length; i < n; i++)
        if (accented.indexOf(outChars[i]) != -1)
            outChars[i] = Character.toLowerCase(outChars[i]);

    return new String(outChars);

}
String in = "CLÉMENT";    // input  string: CLÉMENT
String out = convert(in); // output string: CLéMENT

这似乎是一个奇怪的要求,但这里有一个解决方案:

  /** matches non-ASCII upper-case letters */
  private static final Pattern UPPER =
                        Pattern.compile("[\\p{javaUpperCase}&&[^\\p{Upper}]]+");

  private static String lowerNonAscii(String str, Locale locale) {
    StringBuilder buffer = new StringBuilder();
    Matcher matcher = UPPER.matcher(str);
    int start = 0;
    while (matcher.find()) {
      String nonMatch = str.substring(start, matcher.start());
      String match = str.substring(matcher.start(), matcher.end())
          .toLowerCase(locale);
      buffer.append(nonMatch)
          .append(match);
      start = matcher.end();
    }
    String tail = str.substring(start, str.length());
    return buffer.append(tail)
        .toString();
  }

  public static void main(String[] args) {
    String test = "CL\u00C9MENT";
    System.out.println(test + " > " + lowerNonAscii(test, Locale.ENGLISH));
  }
请注意:

  • 如果没有区域设置,案例是没有意义的,所以您必须提供一个
  • 对于分解的字符没有特殊的处理,也就是说,当字母和重音是分开的
    char
    s时

或者,您可以使用正则表达式来检测重音字符。但是如果重音字符的数量很小,一个简单的
indexOf()
操作就足够了,谢谢你,我使用了你的解决方案。是的,我也检查了正则表达式,但名称中重音字符的数量显然很小。谢谢,这显然是最通用的解决方案。再次感谢所有的细节!这似乎不符合我的确切需要(仅小写重音字符),无论如何谢谢你的建议。