Я пытаюсь заменить определенный символ в строке на другой. Это довольно неясные латинские символы. Я хочу заменить символ (шестнадцатеричный) 259 на 4d9, поэтому я попробовал это:
str_replace("\x02\x59","\x04\xd9",$string);
Это не сработало. Как мне это сделать?
** РЕДАКТИРОВАТЬ: Дополнительная информация.
Спасибо bobince, что сделал трюк. Хотя, я хочу также заменить верхний регистр schwa, и он почему-то не работает. Я вычислил 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
во втором str_replace
, странно. Он остается равным U + 018F. Угадайте, что я могу запустить строку через strtolower
но это должно работать.
U + 0259 Latin Small Letter Schwa кодируется только как байтовая последовательность 0x02,0x59 в кодировке UTF-16BE. Очень маловероятно, что вы будете работать с байтовыми строками в кодировке UTF-16BE, поскольку это не кодировка, совместимая с ASCII, и почти никто ее не использует.
Кодировка, с которой вы хотите работать (единственная кодировка ASCII-superset для поддержки как латинской 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);
Несколько возможных предложений. Во-первых, помните, что вам нужно назначить новое значение $ string, то есть:
$string = str_replace("\x02\x59","\x04\xd9",$string);
Во-вторых, убедитесь, что поток байтов встречается в строке $. Я упоминаю об этом, потому что ваша шестнадцатеричная строка начинается с младшего байта, поэтому вам нужно убедиться, что ваша строка $ не кодируется UTF8.