2013-04-02 68 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