itextpdf中国語の文字化け問題の研究
2623 ワード
最近はjavaコードでpdfを生成するつもりですが、結果としてitextpdfを見つけました。とても強いと思います。ネットで中国語をサポートしていません。itextAsiaを引用して長い間中国語で文字化けをしました。
彼はネット上の様々な方法で中国語を生成できますが、文字化けです。仕方なく文字セットを調べてみました。すべてはCharete.defaultCharrset()から始まります。
System.out.println(Charett.default Charrst);出力結果がGBKであれば、恐れ入りますが、文字化けは正常です。UTF 8であれば、文字化けがないことをおめでとうございます。オンラインで何をダウンロードすると聞きましたが、extrajars-23.3.zipはほとんど弱くなりました。実は何もダウンロードしなくてもいいです。
下記のプログラムを実行すると文字化けします。
私たちがdefault Charrsetを変えるなら、すべて解決しますが、あいにくあなたのプログラムは運行環境に依存しています。これはよくないです。次のように変更します。
default Charrsetを変えたくないなら、文字列をutfコードに変えたらいいじゃないですか?
Dcument.add(new Paraph)//文字化け
彼はネット上の様々な方法で中国語を生成できますが、文字化けです。仕方なく文字セットを調べてみました。すべてはCharete.defaultCharrset()から始まります。
System.out.println(Charett.default Charrst);出力結果がGBKであれば、恐れ入りますが、文字化けは正常です。UTF 8であれば、文字化けがないことをおめでとうございます。オンラインで何をダウンロードすると聞きましたが、extrajars-23.3.zipはほとんど弱くなりました。実は何もダウンロードしなくてもいいです。
implementation group: 'com.itextpdf', name: 'itextpdf', version: '+'
implementation group: 'com.itextpdf', name: 'itext-asian', version: '+'
バージョンを指定したい場合:implementation group: 'com.itextpdf', name: 'itextpdf', version: '5.4.4'
implementation group: 'com.itextpdf', name: 'itext-asian', version: '5.2.0'
実は文字化けが乱れていません。バージョンとは関係ありません。下記のプログラムを実行すると文字化けします。
public static void main(String[] args) throws Exception{
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("createSamplePDF.pdf"));
BaseFont bfChinese = BaseFont.createFont( "STSongStd-Light" , "UniGB-UCS2-H" , false);
Font font = new Font(bfChinese, 14, Font.NORMAL);
document.addAuthor("WESTDREAM");
document.addTitle("Test iText");
document.addSubject("This is an iText demo");
document.addKeywords("iText keywords");
document.addCreator("Using iText");
document.open();
document.add(new Paragraph(" dfds 3333", font));
document.close();
System.out.println(Charset.defaultCharset().name());
}
コンソールがGBKを出力すると文字化けが発生します。もしあなたのコンソールがUTF 8を出力すれば文字化けはしません。私たちがdefault Charrsetを変えるなら、すべて解決しますが、あいにくあなたのプログラムは運行環境に依存しています。これはよくないです。次のように変更します。
default Charrsetを変えたくないなら、文字列をutfコードに変えたらいいじゃないですか?
Dcument.add(new Paraph)//文字化け
document.add(new Paragraph(new String(" dfds 3333".getBytes(), "utf8"), font));//
このようにするメリットは、あなたのシステムがどんな文字を使っているかに関わらず、私はすべてutf 8に変えます。だから問題は解決して、フォントを導入する必要はなくて、この二つのカバンだけが必要です。一刀切れば環境変数を設定します。windows jdk → “JAVA_TOOL_OPTIONS” , “-Dfile.encoding=UTF-8”
linuxは試したことがありません。このような環境に依存する方式は嫌です。だからツールを準備しましょう。public static String getUTF8String(String string){
if (string != null){
try{
return new String(string.getBytes(), "utf8");
}catch (Exception e){
e.printStackTrace();
}
}
return "hah string to utf8 fail";
}