Сравнение Charset
Мне нужна срочная помощь. Я не могу сравнить строки кодировки. Строка, записанная в базу данных table1: utf-8 charset
но выглядит все еще странно: SADI Однако строка, записанная в table2 в той же базе данных, SADI
что нормально. всякий раз, когда я сравниваю оба, это дает ложь.
Любая идея, как можно сделать сравнение? (на самом деле сравнение должно дать истинный результат)
Любая идея, как я могу вставить SADI как
SADI
в базу данных.
Надеюсь, что решение будет любым.
1 ответ
В твоих строках, SADI
стандартная строка ASCII, но SADI
использует символы Юникода полной ширины.
Например, S
это 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