В чем разница между переключателем и выбором в Go?

Я столкнулся с той же проблемой, связанной с проверкой равенства строк. Одна из строк сравнения имеет код символа 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, 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]

blockquote>

Используйте следующий код для разных пространств и их байтовых кодов: 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 Core Libraries for Java .
    String replaceFrom = CharMatcher.WHITESPACE.replaceFrom( s2, " " );
    
    Для URL-кодирования для пробела используйте Guava laibrary.
    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");
    }

}

24
задан Thomas 12 August 2016 в 02:31
поделиться