占用6个字节的字符

时间:2013-04-02 18:59:19

标签: java oracle character-encoding

我们正在尝试保存以下字符串,这实际上是db中的名称,我们进行了一些api调用,我们得到了这个名字:

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

通过我们的代码保存(如在servlet - hibernate - 数据库中),我们收到错误:

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个字节的字符吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

它可能在字符串中包含HTML实体。与燃或可能的网址格式%8C%9A一样。或者也许是UTF7,如[Ay76b。 (我编写了这些值,但实际值相似)。依赖任何具有字符编码的框架总是很痛苦,因为它的作者很可能是美国或欧洲,两者都足以使用简单的ANSI,其中一个字节等于一个字符。 如果你设法理解你的编码并将其转换为真正的UTF8甚至是UTF16,那么在这种特殊情况下它会占用更少的空间。

答案 1 :(得分: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