Я столкнулся с той же проблемой, связанной с проверкой равенства строк. Одна из строк сравнения имеет код символа ASCII 128-255 .
, т. е. неразрывная space - [Hex - A0] Space [Hex - 20]. Показать Неразрывное пространство над HTML. Я использовал следующий
spacing entities
. Их характер и его байты похожи на&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()));
Выход в байтах:
S1: [77, 121,
blockquote>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]Используйте следующий код для разных пространств и их байтовых кодов:
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(); }
- ➩ ASCII транслитерации Строка Unicode для Java.
unidecode
String initials = Unidecode.decode( s2 );
- ➩ с помощью
Guava
: Google CoreLibraries for Java
.Для URL-кодирования для пробела используйте Guava laibrary.String replaceFrom = CharMatcher.WHITESPACE.replaceFrom( s2, " " );
String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);
- ➩ Для преодоления этой проблемы используется
String.replaceAll()
с некоторыми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(" ", " ");
- ➩ Используя java.text.Normalizer.Form . Это перечисление предоставляет константы четырех форматов нормализации Unicode, которые описаны в стандартном приложении Unicode № 15 - формах нормализации Unicode и два метода доступа к ним.
s2 = Normalizer.normalize(s2, Normalizer.Form.NFKC);
Тестирование Строки и выходы на разных подходах, таких как ➩ 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 );
Использование Unidecode - это
best choice
, Мой последний код, показанный ниже.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"); } }