2015-04-19 101 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個字節