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