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

flmtquvp  于 2023-01-19  发布在  Java
关注(0)|答案(6)|浏览(142)

我正在尝试遵循代码

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

我得到的输出是SS.CFG,因为Unicode没有定义ß的大写版本,而我想要的输出是ß.CFG
我有什么办法可以做到吗?

sirbozc5

sirbozc51#

“ß”字符等同于“ss”(例如,用于德语),并且在您的区域设置(您在应用中使用的区域设置)中定义为“is”。
您可以尝试使用以下方法对不同的语言环境进行一些试验:

toUpperCase(Locale locale)

编辑:正如用户所说,这个方法是无效的,一个可能的变通方法(不是很优雅)是:

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

mzmfm0qo2#

toUpperCase( Locale )的文档明确说明了将发生的情况:
由于大小写Map并不总是1:1字符Map,因此结果String的长度可能与原始String的长度不同。
小写字母升s -〉两个字母:安全等级

dpiehjr4

dpiehjr43#

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的大写转换形式,你需要自己指定并实现它。
(If你想看到一群人因为"大写ß"而在衣领下发热,请阅读此电子邮件线程-http://unicode.org/mail-arch/unicode-ml/y2007-m05/0007.html

x7rlezfr

x7rlezfr4#

试试java.lang.String.toUpperCase(java.util.Locale)

p8h8hvxi

p8h8hvxi5#

看起来Characeter.toUpperCase()忽略了这些规则,因此您可以使用它来实现所需的转换:
字符串大小写Map方法比字符大小写Map方法有几个优点。字符串大小写Map方法可以执行区域设置相关Map、上下文相关Map和1:M字符Map,而字符大小写Map方法不能。

vybvopom

vybvopom6#

这样就能破案了

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

相关问题