Заменить юникод - PullRequest
       19

Заменить юникод

4 голосов
/ 18 октября 2010

Я пытаюсь заменить один символ в строке другим. Это довольно малоизвестные латинские буквы. Я хочу заменить символ (hex) 259 на 4d9, поэтому я попробовал это:

str_replace("\x02\x59","\x04\xd9",$string);

Это не сработало. Как мне это сделать?

** EDIT: дополнительная информация.

Спасибо, Бобинс, что добился цели. Хотя, я хочу заменить прописную букву также, и она почему-то не работает. Я вычислил U + 018F (Ə) как UTF-8 0xC68F, и его следует заменить на U + 04D8 (0xD398):

$string = str_replace("\xC9\x99", "\xD3\x99", $_POST['string_with_schwa']); //lc 259->4d9
$string = str_replace( "\xC6\8F", "\xD3\x98" , $string); //uc 18f->4d8

Я копирую 'Ə' в текстовое поле и публикую его. Первый str_replace прекрасно работает в нижнем регистре, но не обнаруживает верхний регистр во втором str_replace, странно. Остается как U + 018F. Полагаю, я могу запустить строку через strtolower, но это должно сработать.

Ответы [ 2 ]

4 голосов
/ 19 октября 2010

U + 0259 Латинская строчная буква Schwa кодируется только как последовательность байтов 0x02,0x59 в кодировке UTF-16BE. Маловероятно, что вы будете работать с байтовыми строками в кодировке UTF-16BE, поскольку это не ASCII-совместимая кодировка, и почти никто не использует ее.

Кодировка, с которой вы хотите работать (единственная ASCII-надмножественная кодировка, поддерживающая как Latin Schwa, так и кириллическая Schwa, поскольку она поддерживает все символы Unicode) - UTF-8 . Убедитесь, что ваш ввод равен в формате UTF-8 (если он поступает из данных формы, используйте страницу, содержащую форму, как UTF-8). Затем в UTF-8 символ U + 0259 представляется с использованием последовательности байтов 0xC9,0x99.

str_replace("\xC9\x99", "\xD3\x99", $string);

Если вы сохраните файл .php как UTF-8-no-BOM в текстовом редакторе, вы можете пропустить экранирование и просто сказать:

str_replace('ə', 'ә', $string);
0 голосов
/ 18 октября 2010

Пара возможных предложений. Во-первых, помните, что вам нужно присвоить новое значение переменной $ string, т.е. ::100100

$string = str_replace("\x02\x59","\x04\xd9",$string);

Во-вторых, убедитесь, что ваш поток байтов находится в строке $. Я упоминаю об этом, потому что ваша шестнадцатеричная строка начинается с младшего байта, поэтому вам нужно убедиться, что ваша строка $ не имеет кодировки UTF8.

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