Как написать хорошее регулярное выражение для различения арабских и английских символов в Oracle, используя кодировку AR8MSWIN1256? - PullRequest
1 голос
/ 21 августа 2009

Я обыскивал Google и не могу найти ответ. Я использую Oracle 10g Enterprise со следующим набором символов: AR8MSWIN1256

База данных содержит значения на английском и арабском языках, и мне нужно время от времени проводить различия между ними. Я написал этот скрипт, который соответствует английским словам, но не арабским:

create or replace function GET_LANGUAGE (v_value in varchar2)
return varchar2 as
begin
    if (REGEXP_LIKE(v_value, '[\x00-\x7F]+')) then
        return 'ENGLISH';
    -- Arabic
    elsif (REGEXP_LIKE(v_value, '[\xA0-\xF2]+')) then
        return 'ARABIC';
    else
        return 'UNKNOWN';
    end if;
end;

Есть предложения? Спасибо!

1 Ответ

2 голосов
/ 02 сентября 2009

Я ничего не знаю об арабском, но насколько я вижу из кодовой страницы в Википедии , ваш сценарий в основном правильный, за исключением того, что , похоже, , некоторые арабские символы диапазон [\x80-\x9F], так что вы можете захотеть использовать более широкий диапазон ... кроме того, я не знаю, использует ли арабский язык то же пространство ASCII, что и английский, но в этом случае вы также захотите включить его; и, вероятно, другие контрольные символы в диапазоне [\x00-\x1F].

Лично я бы просто избегал «арабского эльсифа» и возвращал «арабский» в другом, так как в любом случае арабский матч будет совпадать с большей частью кодировки, и это не является убедительным доказательством того, что текст наверняка не английский или арабский.

Примерно так же, включая несколько английских символов в конце кодировки: (полностью не проверено)

create or replace function GET_LANGUAGE (v_value in varchar2)
return varchar2 as
begin
    if (REGEXP_LIKE(v_value, '[\x00-\x80\x82-\x89\x8B\x8C\x91-\x97\x99\x9B\x9C\xF3-\xFC]+')) then
        return 'ENGLISH';
    else
        return 'ARABIC';
    end if;
end;
...