簡體   English   中英

為什么我不能在Java的char數組中存儲日語UTF-8字符?

[英]Why can't I store Japanese UTF-8 characters in char array in Java?

我有一個字符串“ 1234567(Asics(アicsックス“ーキング))”。 它具有unicode字符,有些是ASCII的一部分,有些則不是。 Java所做的是,ASCII字符占用一個字節,其他Unicode字符占用兩個字節。

我的程序的某些部分無法處理這種格式的字符串。 所以我想將值編碼為轉義序列。

所以字符串

“ 1234567(Asics(アicsックスワーキング))”

將映射到

“\\ u0031 \\ u0032 \\ u0033 \\ u0034 \\ u0035 \\ u0036 \\ u0037 \\ u0028 \\ u0041 \\ u0073 \\ u0069 \\ u0063 \\ u0073 \\ u0020 \\ u0028 \\ u30a2 \\ u30b7 \\ u30c3 \\ u30af \\ u30b9 \\ u30ef \\ u30fc \\ u30ad \\ u30f3 \\ u30b0 \\ u0029 \\ u0020 \\ u0029"

我寫了這個功能來做到這一點:-

public static String convertToEscaped(String utf8) throws java.lang.Exception
    {
    char[] str = utf8.toCharArray();
    StringBuilder unicodeStringBuilder = new StringBuilder();
    for(int i = 0; i < str.length; i++){
    char charValue = str[i];
    int intValue = (int) charValue;
    String hexValue = Integer.toHexString(intValue);
    unicodeStringBuilder.append("\\u");
    for (int length = hexValue.length(); length < 4; length++) {
        unicodeStringBuilder.append("0");
    }
    unicodeStringBuilder.append(hexValue);
    }
    return unicodeStringBuilder.toString();
    }

這在我的程序外部運行正常,但在程序內部引起了問題。 這是行char[] str = utf8.toCharArray();發生的情況char[] str = utf8.toCharArray(); 我不知何故失去了我的日語unicode字符,這是因為t在char數組中將這些字符分成2個。

因此,我決定改用byte []

    public static String convertToEscaped(String utf8) throws java.lang.Exception
    {
    byte str[] = utf8.getBytes();
    StringBuilder unicodeStringBuilder = new StringBuilder();
    for(int i = 0; i < str.length - 1 ; i+=2){
    int intValue = (int) str[i]* 256 + (int)str[i+1];
    String hexValue = Integer.toHexString(intValue);
    unicodeStringBuilder.append("\\u");
    for (int length = hexValue.length(); length < 4; length++) {
        unicodeStringBuilder.append("0");
    }
    unicodeStringBuilder.append(hexValue);
    }
    return unicodeStringBuilder.toString();
    }

輸出:\\ u3132 \\ u3334 \\ u3536 \\ u3738 \\ u2841 \\ u7369 \\ u6373 \\ u2028 \\ uffffe282 \\ uffffa1e3 \\ uffff81b7 \\ uffffe283 \\ uffff82e3 \\ uffff81af \\ uffffe282 \\ uffffb8e3 \\ uffff82af \\ uffffe283 \\ uffffbbe3 \\ uffff81 \\ uffffbb33

但這也是錯誤的,因為我將兩個單字節字符合並為一個。 我該如何克服呢?

我不知道您其他代碼的特定要求。 但是我的建議是不要重蹈覆轍,而是使用API​​的內置編碼功能。

例如,根據您需要的字節序調用帶有StandardCharsets.UTF_16BEStandardCharsets.UTF_16LEgetBytes

String s = "1234567(Asics (アシックスワーキング) )";

byte[] utf8 = s.getBytes(StandardCharsets.UTF_8);
byte[] utf16 = s.getBytes(StandardCharsets.UTF_16BE); // high order byte first

System.out.println(s.length()); // 28
System.out.println(utf8.length); // 48
System.out.println(utf16.length); // 56 (2 bytes for each char)

正如他們在上面所述,java中string的內部表示是utf-16。 發現

對您的情況有用的Character.codePointAt()和Integer.toHexString()。

將參數重命名為theString,還從原始方法中刪除了throws Exception子句,因為未引發任何異常。 (通常,將這些通用異常拋出是不好的做法)

public static String convertToEscaped(String theString) {
    char[] charArr = theString.toCharArray();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < charArr.length; i++) {
        String hexString = Integer.toHexString(Character.codePointAt(charArr, i));

        sb.append("\\u");

        if (hexString.length() == 2) {
            sb.append("00");
        }
        sb.append(hexString);
    }
    return sb.toString();
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM