Сравнение Charset

Мне нужна срочная помощь. Я не могу сравнить строки кодировки. Строка, записанная в базу данных table1: utf-8 charset но выглядит все еще странно: SADI Однако строка, записанная в table2 в той же базе данных, SADI что нормально. всякий раз, когда я сравниваю оба, это дает ложь.

  1. Любая идея, как можно сделать сравнение? (на самом деле сравнение должно дать истинный результат)

  2. Любая идея, как я могу вставить SADI как SADI в базу данных.

Надеюсь, что решение будет любым.

1 ответ

Решение

В твоих строках, SADI стандартная строка ASCII, но SADI использует символы Юникода полной ширины.

Например, это U+FF33 'ПИСЬМО ПОЛНОЙ СТОРОНЫ ЛАТИНЫ S' (UTF-8: 0xEF 0xBC 0xB3),

но S является стандартным ASCII U + 0053 'LATIN CAPITAL LETTER S' (UTF-8 0x53).

Другие символы также похожи на расширенные символы Юникода, которые выглядят как стандартные латинские буквы, но на самом деле это не так.

Как они туда попали - это хороший вопрос. Возможно, кто-то получил действительно творческий подход и скопировал что-то из Word? Кто знает.

Вы можете преобразовать эти странные символы обратно в обычные, применив Unicode NFKC ( Форма нормализации Unicode KC), используя этот скрипт Perl в качестве фильтра (он принимает UTF-8 и выводит нормализованный UTF-8):

use Unicode::Normalize;
binmode STDIN,  ':utf8';
binmode STDOUT, ':utf8';
while(<>) { print NFKC($_); }

В php:

$result = Normalizer::normalize( $str, Normalizer::FORM_KC );

Требуется расширение intl