2013-04-02 20 views
6

Próbujemy uratować poniższy łańcuch, który jest w rzeczywistości nazwa w db, robimy pewne wywołania API i mamy tę nazwę:charakter biorąc 6 bajtów

株式会社 エ Sty · ダ ブ リ ュ ー · コ ミ Marrakech ニ ケ ー シ ョ ン ズ

While oszczędności za pośrednictwem naszego kodu (jak w serwletu - Hibernacja - baza danych), otrzymujemy błąd:

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

to 23 znaków, ale wygląda to przy 6 bajtów na znak, że to tylko żeby było 138.

Poniżej kod daje mi 69:

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

I to daje mi 92:

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

będę na pewno sprawdzić NLS_CHARACTERSET i zobaczyć klas IO ale czy kiedykolwiek widział znak biorąc 6 bajtów? Każda pomoc będzie doceniana.

+3

przeczytać i zobaczyć, czy to pomaga: http://stackoverflow.com/questions/6063148/java-unicode-where-to-find-example-n-byte-unicode-characters – Crontab

+3

+1 dla powyższego linku. Zapamiętaj wzmiankę (w komentarzu do [tej odpowiedzi] (http://stackoverflow.com/a/6066442/240733)) z [kodowania CESU-8 **] (http: //en.wikipedia .org/wiki/CESU-8), o których mówi się, że Oracle DB używają i które mogą skutkować 6-bajtowymi znakami "UTF-8". – stakx

+0

Czy używasz CHINESE_CHINA.WE8ISO8859P1? –

Odpowiedz

3

Prawdopodobnie zawiera elementy HTML w ciągu znaków. Jak 燃 lub ewentualnie styl adresu URL, %8C%9A. A może UTF7, np. [Ay76b. (Zrobiłem te wartości, ale twoje rzeczywiste będą podobne). Zawsze trudno jest polegać na dowolnym frameworku z kodowaniem znaków, ponieważ jego autorzy byli prawdopodobnie Amerykanami lub Europejczykami, oba wystarczające dla zwykłego ANSI, gdzie jeden bajt równa się jednemu znakowi. Jeśli udało się zrozumieć kodowanie i przekonwertować go do prawdziwego UTF8 lub nawet UTF16, zajmowałoby to mniej miejsca w tym konkretnym przypadku.

+0

@Alex - Nie Nie używam kodowania chińskiej porcelany. –

0

Prawdopodobnie dosłownie:

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

Patrz:

"\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