Java:多字节字符串长度

Java:多字节字符串长度,java,Java,我有一种为命令行程序打印“标题文本”的方法,很像Markdown的语法: 1. ======================= 2. This is a header string 3. ======================= 此方法为第1行和第3行获取字符c,并根据s的长度将其重复n次 String.length()适用于英语字母表,但如何找到包含外来多字节字符(如“Å”和“ߍ”)的字符串的长度(即可视长度)?String.length()适用于大多数字符,包括Å和ߍ 在每个字符占用

我有一种为命令行程序打印“标题文本”的方法,很像Markdown的语法:

1. =======================
2. This is a header string
3. =======================
此方法为第1行和第3行获取字符
c
,并根据
s
的长度将其重复
n

String.length()
适用于英语字母表,但如何找到包含外来多字节字符(如“Å”和“ߍ”)的字符串的长度(即可视长度)?

String.length()
适用于大多数字符,包括
Å
ߍ

在每个
字符
占用
2
4
字节的情况下对A进行编码

表示采用
4
字节的字符,通过配对两个字符来实现,在这种情况下,必须使用
codePointCount
操作,而不是
length


虽然标准unicode规范中肯定存在字符。

字符串。对于这些类型的字符,长度可以满足要求,因为Java字符串使用UTF-16,UTF-16足以表示大多数常用字符(拉丁、希腊、阿拉伯语、希伯来、中文、泰国、德瓦纳加里等)


如果您可能需要处理U+FFFF以上的字符,那么您需要使用
codePointCount
而不是
length
来处理代理项对。

s.length()
如果
s
为“Ø”,则会给我一个
2
的值。我希望这是
1
。我相信,根据编译程序时使用的文件编码,您可能会得到不同的值。@josocblaugrana:我不能确认这一点。我试着运行下面的程序,它打印了1:public class A{public static void main(String[]args){System.out.println(“Ø.length());}}@ReyCharles:在我这边,运行
System.out.println(“Ø.length())
(没有其他东西)会为记录返回
2
…的值,我使用的是Mac。@josocblaugrana显然,您告诉编译器使用的编码必须与Java源文件的编码相匹配,就像您在读取文本文件时必须将正确的编码传递给
InputStreamReader
一样。如果您的
.java
文件是UTF-8格式,但您的编译器将其读取为ISO-8859-1或MacRoman格式,那么它将看到字符串文本为
“\u00c3\u0098”
,而不是
”\u00D8“
。如果您不能确定编译器将设置为什么编码,则必须在源代码中使用Unicode转义(即
“\u00D8”
而不是
“Ø”
)。您可以使用
native2ascii
工具自动执行此操作。可能您读取的字符串编码不正确。在utf16中,每个字符需要2或4个字节。@RokKralj,这正是我想要说的。很好,您发现它不够清晰