2012-04-28 22 views
5

puedo buscar un char CJK (como ) mediante el uso de un punto de código Unicode:¿Cómo buscar todos los caracteres CJK en vim?

/\%u5c0f 
/[\u5c0f] 

no puedo buscar todas CJK caracteres utilizando [\u4E00-\u9FFF], porque manual de vim dice:

:help /[]
NOTE: The other backslash codes mentioned above do not work inside []!

¿Estas son una forma de hacer el trabajo?

+0

Si solo busca caracteres CJK específicos, puede escribir el CJK en la búsqueda. Por ejemplo:/小 –

Respuesta

2

Vim en realidad no puede hacer esto por sí mismo, ya que no se les da acceso a las propiedades Unicode como \p{Han}.

A partir de la versión 6.0 de Unicode, la gama de puntos de código de caracteres en la secuencia de comandos Han es:

2E80-2E99 2E9B-2EF3 2F00-2FD5 3005-3005 3007-3007 3021-3029 3038-303B 3400-4DB5 4E00-9FCB F900-FA2D FA30-FA6D FA70-FAD9 20000-2A6D6 2A700-2B734 2B740-2B81D 2F800-2FA1D 

Mientras que con Unicode v6.1, la gama de puntos de código Han ha cambiado a:

2E80-2E99 2E9B-2EF3 2F00-2FD5 3005-3005 3007-3007 3021-3029 3038-303B 3400-4DB5 4E00-9FCC F900-FA6D FA70-FAD9 20000-2A6D6 2A700-2B734 2B740-2B81D 2F800-2FA1D 

También parece recordar que Vim tiene dificultades para expresar los puntos del código astral, que son necesarios para que esto funcione correctamente. Por ejemplo, utilizando la notación flexibles \x{HHHHHH} de Java 7 o Perl, usted tendría que:

[\x{2E80}-\x{2E99}\x{2E9B}-\x{2EF3}\x{2F00}-\x{2FD5}\x{3005}-\x{3005}\x{3007}-\x{3007}\x{3021}-\x{3029}\x{3038}-\x{303B}\x{3400}-\x{4DB5}\x{4E00}-\x{9FCC}\x{F900}-\x{FA6D}\x{FA70}-\x{FAD9}\x{20000}-\x{2A6D6}\x{2A700}-\x{2B734}\x{2B740}-\x{2B81D}\x{2F800}-\x{2FA1D}] 

en cuenta que la última parte de la gama es \x{2F800}-\x{2FA1D}, que está fuera del BMP. Pero lo que realmente necesita es \p{Han} (es decir, \p{Script=Han}). De nuevo, esto muestra que los dialectos de expresiones regulares que no admiten al menos Level 1 of UTS#18: Basic Unicode Support son inadecuados para trabajar con Unicode. Las expresiones regulares de Vim son inadecuadas para el trabajo básico de Unicode.


editar para agregar

Aquí está el programa que vuelca a cabo las gamas de puntos de código que se aplican a cualquier secuencia de comandos Unicode dada.

#!/usr/bin/env perl 
# 
# uniscrange - given a Unicode script name, print out the ranges of code 
#    points that apply. 
# Tom Christiansen <[email protected]> 

use strict; 
use warnings; 

use Unicode::UCD qw(charscript); 

for my $arg (@ARGV) { 
    print "$arg: " if @ARGV > 1; 
    dump_range($arg); 
} 

sub dump_range { 
    my($scriptname) = @_; 

    my $alist = charscript($scriptname); 
    unless ($alist) { 
     warn "Unknown script '$scriptname'\n"; 
     return; 
    } 

    for my $aref (@$alist) { 
     my($start, $stop, $name) = @$aref; 
     die "got $name, not $scriptname\n" unless $name eq $scriptname; 
     printf "%04X-%04X ", $start, $stop; 
    } 
    print "\n"; 

} 

Sus respuestas dependen de la versión de Perl - y por lo tanto, la versión de Unicode - que se está ejecutando en contra.

$ perl5.8.8 ~/uniscrange Latin Greek 
Latin: 0041-005A 0061-007A 00AA-00AA 00BA-00BA 00C0-00D6 00D8-00F6 00F8-01BA 01BB-01BB 01BC-01BF 01C0-01C3 01C4-0241 0250-02AF 02B0-02B8 02E0-02E4 1D00-1D25 1D2C-1D5C 1D62-1D65 1D6B-1D77 1D79-1D9A 1D9B-1DBF 1E00-1E9B 1EA0-1EF9 2071-2071 207F-207F 2090-2094 212A-212B FB00-FB06 FF21-FF3A FF41-FF5A 
Greek: 0374-0375 037A-037A 0384-0385 0386-0386 0388-038A 038C-038C 038E-03A1 03A3-03CE 03D0-03E1 03F0-03F5 03F6-03F6 03F7-03FF 1D26-1D2A 1D5D-1D61 1D66-1D6A 1F00-1F15 1F18-1F1D 1F20-1F45 1F48-1F4D 1F50-1F57 1F59-1F59 1F5B-1F5B 1F5D-1F5D 1F5F-1F7D 1F80-1FB4 1FB6-1FBC 1FBD-1FBD 1FBE-1FBE 1FBF-1FC1 1FC2-1FC4 1FC6-1FCC 1FCD-1FCF 1FD0-1FD3 1FD6-1FDB 1FDD-1FDF 1FE0-1FEC 1FED-1FEF 1FF2-1FF4 1FF6-1FFC 1FFD-1FFE 2126-2126 10140-10174 10175-10178 10179-10189 1018A-1018A 1D200-1D241 1D242-1D244 1D245-1D245 

$ perl5.10.0 ~/uniscrange Latin Greek 
Latin: 0041-005A 0061-007A 00AA-00AA 00BA-00BA 00C0-00D6 00D8-00F6 00F8-01BA 01BB-01BB 01BC-01BF 01C0-01C3 01C4-0293 0294-0294 0295-02AF 02B0-02B8 02E0-02E4 1D00-1D25 1D2C-1D5C 1D62-1D65 1D6B-1D77 1D79-1D9A 1D9B-1DBE 1E00-1E9B 1EA0-1EF9 2071-2071 207F-207F 2090-2094 212A-212B 2132-2132 214E-214E 2184-2184 2C60-2C6C 2C74-2C77 FB00-FB06 FF21-FF3A FF41-FF5A 
Greek: 0374-0375 037A-037A 037B-037D 0384-0385 0386-0386 0388-038A 038C-038C 038E-03A1 03A3-03CE 03D0-03E1 03F0-03F5 03F6-03F6 03F7-03FF 1D26-1D2A 1D5D-1D61 1D66-1D6A 1DBF-1DBF 1F00-1F15 1F18-1F1D 1F20-1F45 1F48-1F4D 1F50-1F57 1F59-1F59 1F5B-1F5B 1F5D-1F5D 1F5F-1F7D 1F80-1FB4 1FB6-1FBC 1FBD-1FBD 1FBE-1FBE 1FBF-1FC1 1FC2-1FC4 1FC6-1FCC 1FCD-1FCF 1FD0-1FD3 1FD6-1FDB 1FDD-1FDF 1FE0-1FEC 1FED-1FEF 1FF2-1FF4 1FF6-1FFC 1FFD-1FFE 2126-2126 10140-10174 10175-10178 10179-10189 1018A-1018A 1D200-1D241 1D242-1D244 1D245-1D245 

Puede utilizar el comando corelist -a Unicode para ver qué versión de Unicode va con qué versión de Perl. salida Aquí se selecciona:

$ corelist -a Unicode 
    v5.8.8  4.1.0  
    v5.10.0 5.0.0  
    v5.12.2 5.2.0  
    v5.14.0 6.0.0  
    v5.16.0 6.1.0  
+0

'/ [\ x {2E80} - \ x {2E99}]' ==> 'E16: Rango inválido' – kev

+0

@kev Dije bastante explícitamente que estaba usando la notación' \ x {HHHHHH} '(que Vim hace no lo entiendo) para poder especificar puntos de código arbitrarios en cualquier plano, no solo en el BMP de la manera en que '\ uHHHH' (que Vim entiende). Era necesario hacerlo para comprender el problema. – tchrist

+0

@kev Java7 también usa esa notación para sus expresiones regulares. Es necesario para los puntos de código que están por encima del BMP. Tenga en cuenta que la respuesta que ha aceptado descuida los rangos no BMP en '\ p {Han}', que a partir de Unicode v6.1 son 20000-2A6D6, 2A700-2B734, 2B740-2B81D y 2F800-2FA1D. ¿Le gustaría el programa que escribí que genera esos rangos para usted? – tchrist

4

Parece que los rangos de Vim están de alguna manera limitados al mismo byte alto, porque /[\u4E00-\u4eFF] funciona bien. Si no te importa el lío, intente:

/[\u4e00-\u4eff\u4f00-\u4fff\u5000-\u50ff\u5100-\u51ff\u5200-\u52ff\u5300-\u53ff\u5400-\u54ff\u5500-\u55ff\u5600-\u56ff\u5700-\u57ff\u5800-\u58ff\u5900-\u59ff\u5a00-\u5aff\u5b00-\u5bff\u5c00-\u5cff\u5d00-\u5dff\u5e00-\u5eff\u5f00-\u5fff\u6000-\u60ff\u6100-\u61ff\u6200-\u62ff\u6300-\u63ff\u6400-\u64ff\u6500-\u65ff\u6600-\u66ff\u6700-\u67ff\u6800-\u68ff\u6900-\u69ff\u6a00-\u6aff\u6b00-\u6bff\u6c00-\u6cff\u6d00-\u6dff\u6e00-\u6eff\u6f00-\u6fff\u7000-\u70ff\u7100-\u71ff\u7200-\u72ff\u7300-\u73ff\u7400-\u74ff\u7500-\u75ff\u7600-\u76ff\u7700-\u77ff\u7800-\u78ff\u7900-\u79ff\u7a00-\u7aff\u7b00-\u7bff\u7c00-\u7cff\u7d00-\u7dff\u7e00-\u7eff\u7f00-\u7fff\u8000-\u80ff\u8100-\u81ff\u8200-\u82ff\u8300-\u83ff\u8400-\u84ff\u8500-\u85ff\u8600-\u86ff\u8700-\u87ff\u8800-\u88ff\u8900-\u89ff\u8a00-\u8aff\u8b00-\u8bff\u8c00-\u8cff\u8d00-\u8dff\u8e00-\u8eff\u8f00-\u8fff\u9000-\u90ff\u9100-\u91ff\u9200-\u92ff\u9300-\u93ff\u9400-\u94ff\u9500-\u95ff\u9600-\u96ff\u9700-\u97ff\u9800-\u98ff\u9900-\u99ff\u9a00-\u9aff\u9b00-\u9bff\u9c00-\u9cff\u9d00-\u9dff\u9e00-\u9eff\u9f00-\u9fff] 
+0

Esta es una buena solución. Gracias. – kev

+0

Vim se congela cuando busco este patrón. Pero yo trabajo ¡Gracias de nuevo! – kev

+1

@kev Sí, se explica en la ayuda: cuando utiliza una colección, el carácter que se va a verificar para una coincidencia se compara con todos los * caracteres * en la colección. No está comprobando si está dentro de cierto rango. Entonces la expresión regular anterior realiza veinte mil novecientos diez cheques por cada personaje. Por supuesto, vim se congela. – ZyX

3

He jugado un poco con esta un poco y, en vim la siguiente parece encontrar todos los caracteres Kanji en mi texto Kanji/Pinyin/Inglés:

[^!-~0-9 aāáǎăàeēéěèiīíǐĭìoōóǒŏòuūúǔùǖǘǚǜ] 
+1

Muchas gracias, funciona mucho, eres el hombre. – whitesiroi

2

Pongo No entiendo el "mismo problema de alto byte", pero parece que no se aplica (al menos no para mí, VIM 7.4) cuando ingresas al personaje para construir los rangos.

Normalmente busco desde U + 3400 (㐀) hasta U + 9FCC (鿌) para capturar caracteres chinos en textos japoneses.

  • U + 3400 (㐀) está empezando de "CJK Unified Ideographs Extensión A"
  • U + 4DC0 - T + 4DFF "Símbolos Yijing Hexagram" es en el medio pero no está excluida por el bien de la simplicidad.
  • U + 9FCC (鿌) es el final de "CJK Unified Ideographs"

Tenga en cuenta que la escritura japonesa utiliza "々" como una repetición de símbolos kanji que no forma parte de este bloque. Puedes encontrarlo en el bloque "Símbolos y signos de puntuación japoneses".

/[㐀-鿌] 

A (casi?) Juego completo de caracteres chinos con extensiones

/[㐀-鿌豈-龎-] 

Esta gama incluye:

  • CJK Unified Ideographs Extensión Un
  • Símbolos Yijing Hexagram (shouldn' t ser parte de él)
  • CJK Unified Ideographs (main part)
  • CJK Compatibility Ideographs
  • CJK Unified Ideographs Extensión B,
  • CJK Unified Ideographs extensión C,
  • CJK Unified Ideographs Extensión D,
  • CJK Compatibility Ideographs Suplemento

Bonificación por personas trabajando en contenido en idioma japonés:

Hiragana va de 3041 a U + U + 3096

/[ぁ-ゟ] 

Katakana

radicales
/[゠-ヿ] 

kanji

/[⺀-⿕] 

símbolos japoneses y puntuación.

Tenga en cuenta que este rango también incluye 々 (repetición del último kanji) y 〆 (abreviación de shime 「し め」). Es posible que desee agregarlos a su rango para encontrar palabras.

[ -〿] 

Símbolos Varios japoneses y caracteres

/[ㇰ-ㇿ㈠-㉃㊀-㍿] 

alfanumérico y Puntuacion (ancho total)

[!-~] 

fuentes:

http://www.fileformat.info/info/unicode/char/9fcc/index.htm http://www.localizingjapan.com/blog/2012/01/20/regular-expressions-for-japanese-text/comment-page-1/#comment-46891

+0

Muchas gracias por Hiragana y Katakana. – whitesiroi

0

En algunos casos simples, uso esto para buscar caracteres chinos. También coincide con caracteres japoneses, rusos, etc.

[^\x00-\xff] 
Cuestiones relacionadas