Служба
My gRPC
не смогла отправить запрос из-за искаженных пользовательских данных.Оказывается, пользовательские данные HR содержат неверную строку UTF-8
, и gRPC
не может ее закодировать.Я сузил поле с ошибками до этой строки:
"Gr\351gory Smith" // Gr�gory Smith (this is coming from an LDAP source)
Поэтому я хочу найти способ очистки таких входных данных, если они содержат неверные UTF-8
кодировки.
Не вижу каких-либо очевидных функций очистки вunicode/utf8
стандартный пакет, вот моя первая наивная попытка:
func naïveSanitizer(in string) (out string) {
for _, rune := range in {
out += string(rune)
}
return
}
Вывод:
Before: Valid UTF-8? false Name: 'Gr�gory Smith' Byte-Count: 13
After: Valid UTF-8? true Name: 'Gr�gory Smith' Byte-Count: 15
версия игровой площадки
Есть лилучший или более стандартный способ получить как можно больше допустимых данных из неверной строки UTF-8
?
Причина, по которой я здесь остановился, заключается в том, что при итерации строки и встречается плохой (3-й) символ,utf8.ValidRune(rune)
возвращает true
: https://play.golang.org/p/_FZzeTRLVls
Итак, мой следующий вопрос: будет ли повторение строки - по одной руне за раз - всегда ли значение руны будет действительным?Даже если исходное кодирование строки источника было искажено?
РЕДАКТИРОВАТЬ:
Просто для пояснения, эти данные поступают из источника LDAP: 500K пользовательских записей.Из этих 500K записей только 15 (пятнадцать), т. Е. ~ 0,03%, возвращают uf8.ValidString(...)
из false
.
Как указали @kostix и @peterSO, значения могут быть действительными, если преобразовать из другое кодирование (например, Latin-1) в UTF-8.Применение этой теории к этим образцам выбросов:
https://play.golang.org/p/9BA7W7qQcV3
Name: "Jean-Fran\u00e7ois Smith" : (good UTF-8) : : Jean-François Smith
Name: "Gr\xe9gory" : (bad UTF-8) : Latin-1-Fix: Grégory
Name: "Fr\xe9d\xe9ric" : (bad UTF-8) : Latin-1-Fix: Frédéric
Name: "Fern\xe1ndez" : (bad UTF-8) : Latin-1-Fix: Fernández
Name: "Gra\xf1a" : (bad UTF-8) : Latin-1-Fix: Graña
Name: "Mu\xf1oz" : (bad UTF-8) : Latin-1-Fix: Muñoz
Name: "P\xe9rez" : (bad UTF-8) : Latin-1-Fix: Pérez
Name: "Garc\xeda" : (bad UTF-8) : Latin-1-Fix: García
Name: "Gro\xdfmann" : (bad UTF-8) : Latin-1-Fix: Großmann
Name: "Ure\xf1a" : (bad UTF-8) : Latin-1-Fix: Ureña
Name: "Iba\xf1ez" : (bad UTF-8) : Latin-1-Fix: Ibañez
Name: "Nu\xf1ez" : (bad UTF-8) : Latin-1-Fix: Nuñez
Name: "Ba\xd1on" : (bad UTF-8) : Latin-1-Fix: BaÑon
Name: "Gonz\xe1lez" : (bad UTF-8) : Latin-1-Fix: González
Name: "Garc\xeda" : (bad UTF-8) : Latin-1-Fix: García
Name: "Guti\xe9rrez" : (bad UTF-8) : Latin-1-Fix: Gutiérrez
Name: "D\xedaz" : (bad UTF-8) : Latin-1-Fix: Díaz
Name: "Encarnaci\xf3n" : (bad UTF-8) : Latin-1-Fix: Encarnación