6

実際にはdbの名前である以下の文字列を保存しようとしています.API呼び出しを行い、この名前を取得します:

株式会社エス・ダブリュー・コミュニケーションズ</p>

コードを保存しているときに (サーブレット - 休止状態 - データベースのように)、エラーが発生します。

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

これは 23 文字ですが、1 文字あたり 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);

IO クラスは必ず確認NLS_CHARACTERSETしますが、6 バイトの文字を見たことがありますか? どんな助けでも大歓迎です。

4

2 に答える 2

3

おそらく HTML エンティティを文字列に保持します。のように&#29123;、またはおそらく URL スタイル、%8C%9A. または多分UTF7、のように[Ay76b。(私はこれらの値を作成しましたが、実際の値は似ています)。文字エンコーディングを使用するフレームワークに依存するのは常に面倒です。その作成者はおそらく米国またはヨーロッパ人であり、どちらも 1 バイトが 1 文字に等しい単純な ANSI で十分です。エンコーディングを理解して、それを実際の UTF8 または UTF16 に変換した場合、この特定のケースではスペースが少なくてすみます。

于 2013-04-02T19:37:02.710 に答える
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

対:

"\\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
于 2013-04-03T10:29:11.353 に答える