2011-03-03 61 views
2

我有日文字符的文件名。文件名:S-最終條件.pdf。在Java中,文件名:S-最終條件.pdf日文字符的Java編碼

// Support for Japanese file name 
fileNameX = new String(fileName.getBytes("Shift_JIS"),"ISO8859_1"); 

輸出fileNameX是走出S?最終條件.pdf。因此它拋出一個錯誤。我試圖以PDF格式將文件外流,但特定的日語字符「 - 」未被識別,並且在流式傳輸時出現錯誤。

請幫我解決這個問題。
謝謝,人員Prasanna

+0

嘗試使用'UTF-8'而不是'ISO8859-1'。 – 2011-03-03 05:31:33

+0

我試過UTF-8,但它不起作用。有相同的錯誤 – Prasanna 2011-03-03 05:33:11

+5

它看起來像你正在編碼'文件名'與一個字符集和解碼與另一個。我真的沒有看到這一點。爲什麼你不能直接使用'fileName'? – ide 2011-03-03 07:00:36

回答

2

讓我們看看你的代碼實際上做:

//Assign to bytes the UTF-16 String fileName Encoded in Shift_JIS 
//bytes now contains the binary Shift_JIS representation of your String 
final byte[] bytes = fileName.getBytes("Shift_JIS"); 

//Create a new String UTF-16 by interpreting bytes as ISO8859_1 
//Takes the Shift_JIS encoded bytes and interprets it as ISO8859_1 
new String(bytes,"ISO8859_1"); 

Java字符串使用UTF-16的內部表示。由於UTF-16已修復,因此在創建字符串時無法指定目標編碼,因此必須指定正確的源編碼,即字節數組的「Shift_JIS」。

fileNameX應該出來正確無需轉換。

0

這是Shift_JIS代碼和Unicode的映射問題。 Shift_JIS沒有Unicode的所有字符,所以有些字符變成「?」。

以下是從Unicode到Shift_JIS的轉換結果。

RESULT UNICODE 
[NG] U+2012 (FIGURE DASH) 
[NG] U+2013 (EN DASH) 
<OK> U+2014 (EM DASH) 
[NG] U+2015 (HORIZONTAL BAR) 
<OK> U+2212 (MINUS SIGN) 
[NG] U+FF0D (FULLWIDTH HYPHEN-MINUS) 

一種解決方案是替換代碼。

U+2012,U+2013,U+2015 --> U+2014 
U+FF0D    --> U+2212