2016-08-11 6 views
2

Linuxでcronを使用していくつかのJavaコードを実行し、数千のレコードを本番データベースに残しました。そのボックスのロケールcharmapは "ANSI_X3.4-1968"でした。今度は、データベースに永続化する前に、次の手順を実行しました。テキスト 2. 1. StringEscapeUtils.unescapeHtml4はUTF-8形式の文字列を書くと今の問題は、これらの手順の後に特殊文字は「?」として表示されている 誤ってエンコードされた文字を復元する(Java)

データベース

に固執します。元の文字に戻すことは可能ですか? 次の手順で問題をシミュレートしました。コードの行


String insertSpecial = StringEscapeUtils.unescapeHtml4("×"); 
System.out.println(insertSpecial); 
String uni = new String(insertSpecial.getBytes(), "UTF-8");// This value is currently in DB 
System.out.println(uni); 

を以下

  1. 変更Eclipseのエンコーディング
  2. "ANSI_X3.4-1968" への書き込みは、今、私は文字列 "UNI" からバック "×" を取得したいです。どんな助けもありがとう。

答えて

3

基本的には、あなたはnew String(insertSpecial.getBytes(), "UTF-8");で最大の間違いを犯しましたが、これは文字エンコーディングが驚くほど扱いにくいことを再び示しています。

  1. 私のプラットフォームのエンコーディング
  2. insertSpecialからバイトを与えるバイトはUTF-8であることを言って、バイトから新しい文字列を作成します。コードのその部分は、ステップバイステップではない何

    (たとえ以前にプラットフォームのエンコーディングでバイトが得られたとしても)

私はこのコードを何度も見てきましたが、残念なことにそれは物事を壊すだけです。それは完全に不要で、正しく書かれていても何も変換しません。プラットフォームエンコーディングがUTF-8ではない場合、プラットフォームエンコーディングとStringコンストラクタで指定されたものとの間に適切な違いがある場合、特殊文字(または文字列全体さえも)を破棄する可能性が高くなります。

疑問符は、変換できなかった文字のプレースホルダです。つまり、永遠に消えてしまいます。基本的には問題はcronの仕事だったThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+0

:あなたは再びその間違いをしないように

は、ここではいくつかの読書です。手動でテストしたところ、エンコーディングは "UTF-8"で、うまくいきました。しかし、デフォルトではcronジョブから実行したときに異なるエンコーディングが使用されることに気づいていませんでした。スクリプトが実行された後、私たちはこの問題を発見し、入力テキストがなくなっても回復できなくなりました。 –

+0

根本的な問題は、エンコーディングの理解ではありませんでした。私は以前と同じように 'new String(insertSpecial.getBytes()、" UTF-8 ");'行を数回見たことがあります。それはうまくいかないので、なぜそれほど多くの人がそれを試していますか? – Kayaman

関連する問題