2015-04-19 60 views
2

我试图找出字符串存储在UTF-8中的字符串长度。 我尝试以下方法:在Java/Android中查找UTF-8字符串中的字符数

String str = "मेरा नाम"; 
Charset UTF8_CHARSET = Charset.forName("UTF-8"); 
byte[] abc = str.getBytes(UTF8_CHARSET); 
int length = abc.length; 

这使我的字节数组的长度,而不是字符数的字符串中。

我找到了一个显示UTF-8字符串长度和字节长度的网站。假设我的字符串是“无符号”,那么我应该将字符串长度设置为8个字符,而不是22个字节。

任何人都可以请指导。

回答

0

简单地您的程序保存为utf-8 并做如下

 String str= "मेरा नाम"; 
     System.out.println(str.length()); 

O/P = 8

+1

8个字符,其中每个字符都是UTF-16(两个字节)。这是Unicode文本如何存储在字符串中,如'char []'。 –

+1

我没有检查字符串长度函数,我将它转换为UTF-8,然后计算长度。你的答案有助于简单地在文本上使用字符串长度,并且我得到了正确的答案。谢谢。 –

0

而不是转换password[0]为一个字节数组只需运行

password[0].length();

您也可以将bytearray转换回字符串,然后在其上运行lenght方法以及。

byte[] abc = password[0].getBytes(UTF8_CHARSET); 
    String s1 = new String(abc, "UTF-8"); 
    System.out.println(s1.length()); 
1

String.length()实际上返回在UTF-16(其中两个字节用于编码的字符)编码的字符串的字符数。然而,这也适用于大多数UTF-8字符,除非你有一个ASCII值大于127的字符。如果你想手工做的事情,而不编码为UTF-8,你可以做这样的事情

public static int utf8Length(CharSequence sequence) { 
     int count = 0; 
     for (int i = 0; i < sequence.length(); i++) { 
      char ch = sequence.charAt(i); 
      if (ch <= 0x7F) { 
       count++; 
      } else if (ch <= 0x7FF) { 
       count += 2; 
      } else if (Character.isHighSurrogate(ch)) { 
       count += 4; 
       ++i; 
      } else { 
       count += 3; 
      } 
     } 
     return count; 
    } 

这是UTF-8 spec

1

http://rosettacode.org/wiki/String_length#Grapheme_Length_4看看:

import java.text.BreakIterator; 

public class Grapheme { 
    public static void main(String[] args) { 
    printLength("møøse"); 
    printLength(""); 
    printLength("J̲o̲s̲é̲"); 
    } 

    public static void printLength(String s) { 
    BreakIterator it = BreakIterator.getCharacterInstance(); 
    it.setText(s); 
    int count = 0; 
    while (it.next() != BreakIterator.DONE) { 
     count++; 
    } 
    System.out.println("Grapheme length: " + count+ " " + s); 
    } 
} 

输出:

Grapheme length: 5 møøse 
Grapheme length: 7 
Grapheme length: 4 J̲o̲s̲é̲ 

你要找的是不是字符串的长度BU grapeme长度。它为您提供了“可见”字符的数量。

+0

适用于我的表情符号。一个带有五个表情符号的字符串(五个表情符号,在我的测试用例中占用十个字符)返回五个(而不是实际的字符数为10)。 –

4

最短的“长度”是Unicode 代码点,作为编号字符的概念,UTF-32。

在java中8:

int length = (int) string.codePoints().count(); 

之前Java类:

int length(String s) { 
    int n = 0; 
    for (int i = 0; i < s.length(); ++n) { 
     int cp = s.codePointAt(i); 
     i += Character.charCount(cp); 
    } 
    return n; 
} 

甲Unicode代码点可以在UTF-16被编码为一个或两个char秒。

相同的Unicode字符可能有变音符号。可以将它们编写为单独的代码点:基本字母+零个或更多变音符号。为了标准化的字符串一个(C =)压缩码点:

string = java.text.Normalizer.normalize(string, Normalizer.Form.NFC); 

BTW数据库的目的,UTF-16长度似乎更加有用:

string.length() // Number of UTF-16 chars, every char two bytes. 

(在该示例中提到的UTF-32长度== UTF-16的长度。)


转储功能

甲评论者有一些意想不到的结果:

void dump(String s) { 
    int n = 0; 
    for (int i = 0; i < s.length(); ++n) { 
     int cp = s.codePointAt(i); 
     int bytes = Character.charCount(cp); 
     i += bytes; 
     System.out.printf("[%d] #%dB: U+%X = %s%n", 
      n, bytes, cp, Character.getName(cp)); 
    } 
    System.out.printf("Length:%d%n", n); 
} 
+1

对于之前的java,你可以使用's.codePointCount(0,s.length)' – liudongmiao

+0

@liudongmiao谢谢,这对于java 8来说也是很好的。 –

+0

对于我来说,这个答案中的length()方法对于包含5个表情符号(笑脸)的字符串产生10的结果,而不是我预期的5。 –

1

在UTF-8 string.length减()返回的字符数。如果你想获得的字节数,你可以使用String.getBytes()长度

例如:

字符串str = “アンドリューは本当に凄いですだと”;

System.out.println(str.length()); //显示16对应16个字符 System.out.println(str.getBytes()。length); //显示48对应于48个字节