繁体   English   中英

在 java 中使用 toUpperCase() 将 ß.cfg 转换为大写

[英]converting ß.cfg to upper case using toUpperCase() in java

我正在尝试以下代码

String s1 = "ß.cfg";
System.out.println (s.toUpperCase());

output 我得到的是SS.CFG ,因为 Unicode 没有定义 ß 的大写版本,而我希望 output 为ß.CFG

有什么办法可以实现吗?

“ß”字符相当于“ss”(例如在德语中使用),这在您的语言环境(您在应用程序中使用的语言环境)中定义。

您可以尝试使用以下方法对不同的 Locale 进行一些实验:

toUpperCase(Locale locale) 

编辑:正如用户所说,此方法无效,可能的解决方法(不是很优雅)是:

    String s1 = new String ("auß.cfg").replace('ß', '\u9999');
    System.out.println (s1.toUpperCase(Locale.UK).replace('\u9999', 'ß'));

toUpperCase( Locale )的文档明确指出这将发生:

由于大小写映射并不总是 1:1 字符映射,因此生成的字符串可能与原始字符串的长度不同。

小写字母尖 s -> 两个字母:SS

Java 实现只是遵循 Unicode 规范所说的。 Unicode 是这样说的:

# ================================================================================
# Unconditional mappings
# ================================================================================

# The German es-zed is special--the normal mapping is to SS.
# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>))

00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S

参考: http : //unicode.org/Public/UNIDATA/SpecialCasing.txt

如果要实现一种不同于 Unicode 的大写转换形式,则需要自己指定和实现。


(如果你想看到一群人在“大写ß”的领口下变得火爆,请阅读此电子邮件主题 - http://unicode.org/mail-arch/unicode-ml/y2007-m05/0007.html

看起来Characeter.toUpperCase()忽略了这些规则,以便您可以使用它来实现所需的转换:

字符串大小写映射方法比字符大小写映射方法有几个优点。 字符串大小写映射方法可以执行区域设置敏感映射、上下文敏感映射和 1:M 字符映射,而字符大小写映射方法不能。

这将解决这个问题

char[] chars = "ßdenrä".toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = Character.toUpperCase(chars[i]);
}
String output = new String(chars);
System.out.println(output);

结果:ßDENRÄ

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM