2016-12-02 44 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编码单元的编码(大概你只会用后者代表一个完整的编码单元)。 –

相关问题