2013-04-02 112 views
6

我們正在試圖挽救以下字符串這實際上是在數據庫的名稱,我們做了一些API調用,我們得到這個名字:字符以6個字節

株式會社エス·ダブリュー·コミュニケーションズ

雖然通過我們的代碼保存(如小服務程序 - 冬眠 - 數據庫),我們得到一個錯誤:

Caused by: java.sql.BatchUpdateException: ORA-12899: value too large for column "NAME_ON_ACCOUNT" (actual: 138, maximum: 100) 

這是23個字符,但看起來像是考慮每個字符的6個字節,這樣只會使138

下面的代碼給了我69:

byte[] utf8Bytes = string.getBytes("UTF-8");  
System.out.println(utf8Bytes.length); 

這給了我92:

byte[] utf8Bytes = string.getBytes("UTF-32"); 
System.out.println(utf8Bytes.length); 

我一定會檢查NLS_CHARACTERSET,看到了IO類,但你見過一個字符以6個字節?任何幫助都感激不盡。

+3

閱讀這一點,看看是否有幫助:http://stackoverflow.com/questions/6063148/java-unicode-where-to-find-example-n-byte-unicode-characters – Crontab

+3

+1爲上述鏈接。注意[** CESU-8編碼**](http://en.wikipedia)中提到的(在[此回答](http://stackoverflow.com/a/6066442/240733)的評論中) .org/wiki/CESU-8),據說哪些Oracle數據庫被使用,哪些會導致6字節的「UTF-8」字符。 – stakx

+0

您使用的是CHINESE_CHINA.WE8ISO8859P1嗎? –

回答

3

它可能在一個字符串中包含HTML實體。像燃或可能的URL風格,%8C%9A。或者也許UTF7,如[Ay76b。 (我制定了這些價值觀,但你的實際價值會相似)。依賴任何具有字符編碼的框架總是一種痛苦,因爲它的作者可能是美國人或歐洲人,兩者都可以滿足簡單的ANSI,其中一個字節等於一個字符。 如果您設法瞭解您的編碼並將其轉換爲真正的UTF8甚至UTF16,那麼在這種特殊情況下它將佔用較少的空間。

+0

@Alex - 不,我不使用中文中文編碼。 –

0

你可能從字面上:

\u682a\u5f0f\u4f1a\u793e\u30a8\u30b9\u30fb\u30c0\u30d6\u30ea\u30e5\u30fc\u30fb\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30ba 

參見:

"\u682a\u5f0f\u4f1a\u793e\u30a8\u30b9\u30fb\u30c0\u30d6\u30ea\u30e5\u30fc\u30fb\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30ba".length(); 
//23, or 69 UTF-8 bytes 

Vs的:

"\\u682a\\u5f0f\\u4f1a\\u793e\\u30a8\\u30b9\\u30fb\\u30c0\\u30d6\\u30ea\\u30e5\\u30fc\\u30fb\\u30b3\\u30df\\u30e5\\u30cb\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u30ba".length(); 
//138, or 138 UTF-8 bytes