有效/无效的非ascii和无效的ascii字符

时间:2017-11-08 06:32:13

标签: java string ascii non-ascii-characters

我需要测试包含valid non-ascii characters + invalid non-ascii characters + invalid ascii characters的字符串的处理。

有人可以给我几个这样的角色的例子。如果你能让我知道他们在类别中的价值范围会很好,因为我无法区分哪些非ascii值有效以及哪些无效。

Ex : String str = "Bj��rk����oacute�";
                       ^ 
                       Is it a valid or invalid non-ascii

仅供参考我是Java的初学者。

2 个答案:

答案 0 :(得分:1)

一些背景

随着Java的发明,一个非常重要的设计决策是java中的文本将是Unicode:世界上所有字形的编号系统。因此char是两个字节(UTF-16,Unicode和#34;通用字符集转换格式之一")。 byte是二进制数据的不同类型。

Unicode将所有符号(所谓的代码点)(如)编号为U + 266B。那些数字达到三字节整数。因此,java中的代码点表示为int

ASCII 是Unicode UTF-8的7位​​子集,0 - 127。

UTF-8 是一种多字节Unicode格式,其中ASCII是有效子集,更高的符号

<强> 有效期

您被要求识别&#34;无效&#34;字符 =错误生成的代码点。 您还可以识别产生无效字符的代码部分。 (更容易。)

在上面中,占位符字符(如?)替换了当前字符集中无法表示的代码点。如果代码产生?作为占位符,则无法猜测是否发生了替换。对于一些西欧语言,编码是Windows-1252(Cp1252,MS Windows Latin-1)。您可以检查String中的代码点是否可以转换为Charset

然后保留假阳性,但在Cp1252中存在错误的字符。这可能是UTF-8的多字节代码序列,被解释为几个Window-1252字符。所以:与不可接受的非ASCII字符相邻的可接受的非ASCII字符也是可疑的。这意味着您需要列出您的语言中的特殊字符和附加内容:如特殊引号,英语借用çñ

对于MS-Windows Latin-1(改变的ISO Latin-1),例如:

boolean isSuspect(char ch) {
    if (ch < 32) {
        return "\f\n\r\t".indexOf(ch) != -1;
    } else if (ch >= 127) {
        return false;
    } else {
        return suspects.get((int) ch); // Better use a positive list.
    }
}

static BitSet suspects = new BitSet(256);
static {
    ...
}

答案 1 :(得分:0)

有128个有效的基本ASCII字符,映射到值0(NUL字节)到127(DEL字符)。 See here

必须明智地使用“人物”这个词。 “人物”的定义是一个特殊的定义。例如,è是一个字符吗?或者它是两个字符(e`)?这取决于。

其次,字符序列完全独立于其编码。为简单起见,我假设每个字节都被解释为一个字符。

您可以确定是否可以将字节解析为ASCII字符,您只需执行以下操作:

byte[] bytes = "Bj��rk����oacute�".getBytes();
for (byte b : bytes) {
    // What's happening here? A byte that is in the range from 0 to 127 is
    // valid, and other values are invalid. A byte in Java is signed, that
    // means that valid ranges are from -128 to 127.
    if (b >= 0) {
        System.out.println("Valid ASCII");
    }
    else {
        System.out.println("Invalid ASCII");
    }
}