Tôi đã phải đối mặt với cùng một vấn đề liên quan đến kiểm tra tính bằng nhau của Chuỗi, Một trong những chuỗi so sánh có
mã ký tự ASCII 128-255 .
tức là không gian không phá vỡ - [Hex - A0] Space [Hex - 20]. Để hiển thị không gian không phá vỡ trên HTML. Tôi đã sử dụng như sau spacing entities
. Nhân vật của họ và byte của nó giống như&emsp is very wide space[ ]{-30, -128, -125}, &ensp is somewhat wide space[ ]{-30, -128, -126}, &thinsp is narrow space[ ]{32} , Non HTML Space {}
String s1 = "My Sample Space Data", s2 = "My Sample Space Data";
System.out.format("S1: %s\n", java.util.Arrays.toString(s1.getBytes()));
System.out.format("S2: %s\n", java.util.Arrays.toString(s2.getBytes()));
Đầu ra tính bằng byte:
S1: [77, 121 ,, 32
83, 97, 109, 112, 108, 101 ,, 32
83, 112, 97, 99, 101 32
,, 68, 97, 116, 97]
S2: [77, 121 -30, -128, -125
,, 83, 97, 109, 112, 108, 101 ,, -30, -128, -125
83, 112, 97, 99, 101 -30, -128, -125
,, 68, 97, 116, 97]
Sử dụng mã dưới đây cho các không gian khác nhau và mã byte của chúng: wiki for List_of_Unicode_characters
String spacing_entities = "very wide space,narrow space,regular space,invisible separator";
System.out.println("Space String :"+ spacing_entities);
byte[] byteArray =
// spacing_entities.getBytes( Charset.forName("UTF-8") );
// Charset.forName("UTF-8").encode( s2 ).array();
{-30, -128, -125, 44, -30, -128, -126, 44, 32, 44, -62, -96};
System.out.println("Bytes:"+ Arrays.toString( byteArray ) );
try {
System.out.format("Bytes to String[%S] \n ", new String(byteArray, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Phiên âm ASCII của chuỗi Unicode cho Java. unidecode
String initials = Unidecode.decode( s2 );
Sử dụng Guava
: Google Core Libraries for Java
.
String replaceFrom = CharMatcher.WHITESPACE.replaceFrom( s2, " " );
Đối với mã hóa URL cho không gian, hãy sử dụng phép lai Guava.
String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);
Để khắc phục vấn đề này được sử dụng String.replaceAll()
với một số RegularExpression
.
// \p{Z} or \p{Separator}: any kind of whitespace or invisible separator.
s2 = s2.replaceAll("\\p{Zs}", " ");
s2 = s2.replaceAll("[^\\p{ASCII}]", " ");
s2 = s2.replaceAll(" ", " ");
Sử dụng java.text.N normalizer.Form . Enum này cung cấp các hằng số của bốn biểu mẫu chuẩn hóa Unicode được mô tả trong Phụ lục tiêu chuẩn Unicode # 15 - Biểu mẫu chuẩn hóa Unicode và hai phương thức để truy cập chúng.
s2 = Normalizer.normalize(s2, Normalizer.Form.NFKC);
Kiểm tra Chuỗi và đầu ra trên các phương pháp khác nhau như ➩ Unidecode, Normalizer, StringUtils .
String strUni = "Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ Æ,Ø,Ð,ß";
// This is a funky String AE,O,D,ss
String initials = Unidecode.decode( strUni );
// Following Produce this o/p: Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ Æ,Ø,Ð,ß
String temp = Normalizer.normalize(strUni, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
temp = pattern.matcher(temp).replaceAll("");
String input = org.apache.commons.lang3.StringUtils.stripAccents( strUni );
Sử dụng Unidecode là best choice
, Mã cuối cùng của tôi được hiển thị bên dưới.
public static void main(String[] args) {
String s1 = "My Sample Space Data", s2 = "My Sample Space Data";
String initials = Unidecode.decode( s2 );
if( s1.equals(s2)) { //[ , ] %A0 - %2C - %20 « http://www.ascii-code.com/
System.out.println("Equal Unicode Strings");
} else if( s1.equals( initials ) ) {
System.out.println("Equal Non Unicode Strings");
} else {
System.out.println("Not Equal");
}
}