java 检测不属于Windows-1252的字符的最佳方法

nbewdwxp  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(87)

我有一个接收自由文本的服务,比如名字,姓氏,地址等,如果发送的字符不属于windows 1252字符集,我想抛出一个错误,但我不知道如何正确地这样做。我想的是一个正则表达式,但不确定这是否是最好的选择。
正则表达式是letters from cp1252加上任何其他的字母\\w,就像这样:

String test = "ŠŒŽšœžŸÀÁÂà ÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ Þßàáâãäåæçèéêëìíîïð ñòóôõöøùúûüýþÿ asvsdf QWESA 1234 ÜüËëÄäÖö";
System.out.println(test.matches("[ŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ\\w"
        + "\\d\\s\\.]+"));

我不需要检测编码本身,只要它不属于字符集。

lskq00tm

lskq00tm1#

我的建议代码:

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class Windows1252Tester {
    public static void main(String[] args) {
        try {
            // Can we encode the incoming UTF-8 (per OP) as Windows-1252?
            Charset cs = Charset.forName("Windows-1252");
            CharsetEncoder enc = cs.newEncoder();
            System.out.printf("Can charset %s encode sequence %s? %b%n", cs, args[0], enc.canEncode(args[0]));
        }
        catch(Throwable t) {
            t.printStackTrace();
        }
    }
}
y53ybaqx

y53ybaqx2#

你需要检查它的Unicode代码点是否在0x20到0x7E和0xA0到0xFF的范围之外,这个范围涵盖了Windows 1252字符集中所有可打印的ASCII字符和扩展字符,不包括EN破折号。

String input = "any text goes here";

for (int i = 0; i < input.length(); i++)
{
    char c = input.charAt(i);
    if (c < 0x20 || (c > 0x7E && c < 0xA0) || c > 0xFF && c != '\u2013') 
    {
        throw new IllegalArgumentException("Character at index " + i + " does not belong to the Windows 1252 character set: " + c);
    }
}

相关问题