UTF8 По-разному реагирует на регион Турции, чем на регион США - C # - PullRequest
0 голосов
/ 06 июня 2018

Недавно я написал API (стандарт C # .net), который подключается к TCP-серверу, написанному кем-то другим.Он использует пользовательские пакеты, сосредоточенные вокруг протокола HTTP.При чтении / записи пакетов я использую кодировку UTF8.Все клиенты, которые использовали API, могут правильно подключаться независимо от их региона.Однако пользователь из Турции (регион, в котором установлена ​​Турция) не может использовать API.Когда они меняют свой регион на Соединенные Штаты, API работает правильно.

У меня сложилось впечатление, что UTF8 должен быть универсальным стандартом и будет реагировать одинаково в любом регионе.Разве это не так?

Тесты:

  • Windows 10 .net Framework 4.6.1 - США - успех
  • Windows 10 .net Framework 4.6.1 -TR - ошибка
  • Windows 10 .net core 2.0 - США - успех
  • Windows 10 .net core 2.0 - TR - ошибка

Редактирование:

Причина, по которой кодирование важно, заключается в том, что в API существует форма сериализации.Он сериализует словарь строк в одну строку, используя специальные символы, которые определены в начале потока данных.Эти специальные символы меняются в зависимости от содержимого потока.

1 Ответ

0 голосов
/ 06 июня 2018

Из этой информации неясно, характер вызова API, но правила чувствительности к регистру различаются в зависимости от турецкого и других языков, и это наиболее распространенная основная причина ошибок, специфичных для турецкого языка.

В турецком языкепунктирная строчная буква I превращается в прописную букву İ.Строчная безточка ı становится заглавной буквой I, когда она начинается с заглавной буквы.

В операциях сравнения строк необходимо использовать разные правила в зависимости от варианта использования.Вы, вероятно, хотите стандартизировать параметры сортировки в стиле EN-US или C для языка интерфейса команд (в DotNet это что-то вроде StringComparer.InvariantCultureIgnoreCase).Для таких приложений, как текстовый поиск, очевидно, что «правильный» будет более сложным решением, основанным на потребностях ваших пользователей.

Возможно, у вас есть проблемы на стороне клиента, на стороне сервера иликомбинация обоих.

Если вы можете прояснить немного больше о сбое вызова API и механике этого вызова на стороне клиента и сервера, я смогу обновить этот ответ, применив более конкретную информациюк вашему случаю.

Отредактировано, чтобы добавить: На основании того, что вы добавили, вам может понадобиться создать объект словаря с чем-то вроде new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...