Java 检查数据是否可以用指定的编码表示

Java 检查数据是否可以用指定的编码表示,java,encoding,character,Java,Encoding,Character,我正在编写一个Java程序,将数据保存到UTF8文本文件中。但是,我还想提供保存到IBM437的选项,以便与使用相同类型数据文件的旧程序兼容 如何检查用户试图保存的数据是否在IBM437中不可表示?目前,文件保存时没有抱怨,但会导致不寻常的字符被替换为问号 如果我能向用户显示一条警告,说明他们正在保存的数据在IBM437中不受支持,我会更愿意这样做。然后,用户可以选择手动将字符替换为最接近的ASCII等效字符 当前保存代码为: String encoding = "UTF-8"; if (for

我正在编写一个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();

正如JB Nizet在评论中提到的,您可以使用字符集编码器 以及用于将文本/字符串创建为UTF-8 只是我这边的一个建议:

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);
publicstaticchar[]cookie=“HEADER_cookie”.toCharArray();
字节[]cookieInBytes=新字节[COOKIE_SIZE];

对于JB Nizet在评论中提到的(inti=0;i),可以使用字符集编码器 以及用于将文本/字符串创建为UTF-8 只是我这边的一个建议:

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);
publicstaticchar[]cookie=“HEADER_cookie”.toCharArray();
字节[]cookieInBytes=新字节[COOKIE_SIZE];

对于(int i=0;i您当前使用的代码是什么?Charset有一个getEncoder()方法返回CharsetEncoder。CharsetEncoder有一个canEncode(char)方法返回布尔值。javadoc非常有用。我对@JBNizet在javadoc中丢失该值深表歉意。您当前使用什么代码来保存数据?Charset有一个getEncoder()方法返回CharsetEncoder。CharsetEncoder有一个canEncode(char)方法返回一个布尔值。javadoc非常有用。我对@JBNizet在javadoc中遗漏这一点深表歉意。
(byte)cookie[i]
是一个非常可疑的结构。整个算法没有什么意义,似乎只在文本仅包含的情况下有效,这不是问题所暗示的。嗨,汤姆,我自己的编码不太流利,请让我和提问者知道更好的解决方法,以便它支持大多数文本。这将帮助我请不要特别关注算法。这是我在将数据从Java客户端移动到基于C的服务器以获取空字节时的一种解决方案。Java的标准库处理与本机字符编码UTF-16(Unicode字符集的几种库之一)之间的转换。问题涉及转换为CP437,但由于Unicode的代码点比CP437多,因此默认转换将替换不匹配的字符(“?”)。提问者想知道何时会发生这种情况。
canEncode(charSequence)
对Unicode字形和
canEncode(char)进行转换
对UTF-16代码单元执行此操作(假定您将后者仅用于表示完整代码点的代码单元)。
(字节)cookie[i]
是一个非常可疑的结构。整个算法没有什么意义,似乎只在文本仅包含的情况下有效,这不是问题所暗示的。嗨,汤姆,我自己的编码不太流利,请让我和提问者知道更好的解决方法,以便它支持大多数文本。这将帮助我请不要特别关注算法。这是我在将数据从Java客户端移动到基于C的服务器以获取空字节时的一种解决方案。Java的标准库处理与本机字符编码UTF-16(Unicode字符集的几种库之一)之间的转换。问题涉及转换为CP437,但由于Unicode的代码点比CP437多,因此默认转换将替换不匹配的字符(“?”)。提问者想知道何时会发生这种情况。
canEncode(charSequence)
对Unicode字形和
canEncode(char)进行转换
对UTF-16代码单元执行此操作(假设您将后者仅用于表示完整代码点的代码单元)。