Просмотр полной версии : RegExp и кириллица
прывет )
не для кого не секрет что флексовые String.replace, RegExp.exec глючат с кириллицей, корректно всё определяя но некорректно возвращая индексы встретившихся совпадений.
Есть ли народ который с этим успешно борется и как.
:bye:
public function someFunction( newMsg:String ) : void {
...
var str:String = "nor:)maltext ";
//var str:String = "кир:)иллица ";
str.replace(/:\)/ig,trackSmile);
...
}
private function trackSmile(matchedSubstring:String, index:int, str:String){
trace(index);
}
в случае с английским текстом index будет равен 3, в случае с кириллицей - 6.
Возникла мысль написать аналог replace. Щас попробуем.
UPDATE:
Вот, что наэкспериментировалось корявое:
var a:String = 'test кири:(лл:(иц:)ы';
var replace:Function = function(str:String, pattern:RegExp, repl:Object):String {
var output:String = str;
var startIndex:uint = 0;
var addIndex:uint = 0;
var arrIndex:uint = 0;
var arr:Array = str.match(pattern);
var matchedString:String;
var result:String;
var index:uint;
var slices:Array = new Array();
var slice:String = str.substr(startIndex);
var searchIndex:uint = str.substr(startIndex).search(pattern);
if (typeof repl == 'function') {
if (searchIndex!=-1) {
slices.push(slice.substr(0,searchIndex));
} else {
slices.push(slice);
}
while (searchIndex!=-1) {
matchedString = arr[arrIndex];
index = startIndex+searchIndex;
result = repl(matchedString, startIndex+searchIndex, str);
addIndex = matchedString.length;
startIndex = index+addIndex;
slice = str.substr(startIndex);
searchIndex = str.substr(startIndex).search(pattern);
slices[arrIndex]+=result;
if (searchIndex!=-1) {
slices.push(slice.substr(0,searchIndex));
} else {
slices.push(slice);
}
arrIndex++;
if (!pattern.global) break;
}
return slices.join('');
} else {
return str.replace(pattern,repl);;
}
}
var f:Function = function(matchedString:String, index:uint, str:String):String {
trace(matchedString, index, str);
return '[:)]';
}
trace(replace(a, /:[\(\)]/ig,f));
Не проверялось на более сложных регэкспах. А аналог exec мне писать лень :D
в случае с английским текстом index будет равен 3, в случае с кириллицей - 6.
А это случайно не одно и то же, только с конца строки?
Нет, дело в том, что там где-то внутри представление строки идет в два байта на кириллический символ. Похоже на баг.
Я написал об этом в адоб.
vooparker
26.03.2007, 13:12
Да знает Адоби об этом, это старый глюк, тока видимо делать с этим пока ничего не желают =(
Ну, кому нужно replace, могут заюзать мой вариант :D
exec тоже можно поправить.
Нет, дело в том, что там где-то внутри представление строки идет в два байта на кириллический символ. Похоже на баг.
Я написал об этом в адоб.
в русской конфе ruFlex это обсуждалось, если не ошибаюсь, месяца 4 назад. В 2.0.1 вроде как должно было быть пофиксено
Да? Каким образом это могло быть пофиксено, если этим занимается плеер?
Надо посмотреть, что там понаисправляли в плеерах, а не в самом Flex…
UPD: Пофиксено вроде бы в 9.0.28.0:
RegExp .index property isn't double byte aware. (186337)
UPD2: Пофиксили только exec, а replace забыли. Пипец.
Да? Каким образом это могло быть пофиксено, если этим занимается плеер?
Надо посмотреть, что там понаисправляли в плеерах, а не в самом Flex…
точно, пардон : )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.