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

Java 有效/无效的非ascii字符和无效的ascii字符,java,string,ascii,non-ascii-characters,Java,String,Ascii,Non Ascii Characters,我需要测试包含有效非ascii字符+无效非ascii字符+无效ascii字符的字符串的处理 有人能给我举几个这样的例子吗。如果您能让我知道它们在其类别中的值的范围,那就太好了,因为我无法区分哪些非ascii值是有效的,哪些是无效的 Ex : String str = "Bj��rk����oacute�"; ^ Is it a valid or invalid non-ascii 仅供参考,我是Jav

我需要测试包含
有效非ascii字符+无效非ascii字符+无效ascii字符的字符串的处理

有人能给我举几个这样的例子吗。如果您能让我知道它们在其类别中的值的范围,那就太好了,因为我无法区分哪些非ascii值是有效的,哪些是无效的

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

仅供参考,我是Java初学者

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

必须明智地使用“字符”一词。“性格”是一个特殊的定义。例如,
è
,这是一个字符吗?或者是两个字符(
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");
    }
}

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

必须明智地使用“字符”一词。“性格”是一个特殊的定义。例如,
è
,这是一个字符吗?或者是两个字符(
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");
    }
}
一些背景

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

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

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

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

有效性

要求您识别“无效”字符=错误生成的代码点。 您还可以识别产生无效字符的代码部分。(更简单。)

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

然后保留假阳性,即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 {
    ...
}
布尔isSuspect(字符ch){
if(ch<32){
返回“\f\n\r\t”。indexOf(ch)!=-1;
}否则如果(ch>=127){
返回false;
}否则{
返回可疑对象。get((int)ch);//最好使用肯定列表。
}
}
静态位集疑点=新位集(256);
静止的{
...
}
一些背景

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

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

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

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

有效性

要求您识别“无效”字符=错误生成的代码点。 您还可以识别产生无效字符的代码部分。(更简单。)

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

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

对于MS Windows Latin-1(经修改的ISO Latin-1)somet