2016-12-02 53 views
1

我正在寫一個Java程序,將數據保存到UTF8的文本文件來表示。不過,我還想提供選項以保存到IBM437,以便與使用相同類型數據文件的舊程序兼容。檢查數據是否可以在指定的編碼

如何檢查用戶試圖保存的數據是否無法在IBM437中表示?此刻文件保存時沒有抱怨,但結果是不正常的字符被替換爲問號。

我更喜歡它,如果我可以向用戶顯示警告,說明他們正在保存的數據在IBM437中不受支持。然後用戶可以選擇用最接近的ASCII等價物手動替換字符。

電流節省代碼:

String encoding = "UTF-8"; 
if (forceLegacySupport) 
{ 
    // Force character encoding to IBM437 
    encoding = "IBM437"; 
} 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFile.getAbsoluteFile()), encoding)); 
IOController.writeFileToDisk(bw); 
bw.close(); 
+1

什麼代碼,你目前正在使用保存數據? –

+1

字符集有一個返回CharsetEncoder的getEncoder()方法。 CharsetEncoder有一個返回布爾值的canEncode(char)方法。 javadoc非常有用。 –

+0

由於在javadoc中遺漏了@JBNizet,我深表歉意。 – PeteBrew

回答

0

正如評論,你可以使用的字符集編碼器 以及用於創建文本/字符串爲UTF-8 剛剛從我的最終建議中提到的JB Nizet:

public static char[] cookie = "HEADER_COOKIE".toCharArray(); 
byte[] cookieInBytes = new byte[COOKIE_SIZE]; 
for(int i=0;i<cookie.length;i++) 
     { 
      if(i < cookie.length) 
       cookieInBytes[i] = (byte)cookie[i]; 

     } 
String headerStr = new String(cookieInBytes,StandardCharsets.UTF_8); 
+0

'(byte)cookie [i]'是一個非常可疑的構造。整個算法沒什麼意義,似乎只在僅包含[C0 Controls和Basic Latin](http://www.unicode.org/charts/nameslist/index.html)的文本的情況下才起作用,這不是暗示的由問題。 –

+0

嗨湯姆, 我並不那麼流利地使用自己的編碼,請讓我和提問者知道更好的解決方法,以便它支持大多數文本。它肯定會幫助我在未來的作業。 P.s.請不要專注於算法,特別是當我將數據從Java客戶端移動到基於C的服務器的空字節時,這是我的一個解決方案。 –

+0

Java的標準庫處理與其本機字符編碼UTF-16(Unicode字符集中的幾個之一)之間的轉換。問題涉及到轉換爲CP437,但由於Unicode的代碼點比CP437更多,所以默認轉換會替換替換字符('?'),而替換字符不匹配。問題提問者想知道什麼時候會發生。 'canEncode(charSequence)'爲Unicode字形和'canEncode(char)'做了UTF-16編碼單元的編碼(大概你只會用後者代表一個完整的編碼單元)。 –

相關問題