2012-04-28 5 views
5

Ich kann ein CJK char (wie ) suchen, indem Sie einen Unicode-Codepunkt mit:Wie alle CJK-Zeichen in Vim suchen?

/\%u5c0f 
/[\u5c0f] 

Ich kann nicht [\u4E00-\u9FFF] alle CJK Zeichen suchen, indem Sie verwenden, weil vim Handbuch sagt:

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

Ist dies ein Weg, um den Job zu erledigen?

+0

Wenn Sie nur nach bestimmten CJK-Zeichen suchen, können Sie einfach das CJK in die Suche eingeben. Zum Beispiel:/小 –

Antwort

2

Vim kann nicht wirklich tun dies, indem selbst, da Sie keinen Zugriff auf Unicode-Eigenschaften wie \p{Han} gegeben sind.

Ab Unicode v6.0 ist der Bereich von Codepoints für Zeichen in der Han-Skript ist:

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 

Während bei Unicode v6.1 hat sich die Palette von Han-Codepunkte geändert:

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 

Ich erinnere mich auch, dass Vim Schwierigkeiten hat, astrale Codepunkte auszudrücken, die dafür benötigt werden, damit dies korrekt funktioniert. Um zum Beispiel die flexible \x{HHHHHH} Notation von Java 7 oder Perl verwenden, würden Sie haben:

[\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}] 

Beachten Sie, dass der letzte Teil des Bereichs \x{2F800}-\x{2FA1D} ist, die über die BMP ist. Aber was Sie wirklich brauchen, ist \p{Han} (Bedeutung, \p{Script=Han}). Dies zeigt erneut, dass Regex-Dialekte, die mindestens Level 1 of UTS#18: Basic Unicode Support nicht unterstützen, für das Arbeiten mit Unicode nicht geeignet sind. Vims Regexes sind für grundlegende Unicode-Arbeit nicht geeignet.


EDITED

hier hinzufügen ist das Programm, das die Bereiche der Codepunkte Dumps aus, die zu einem bestimmten Unicode-Skript anwenden.

#!/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"; 

} 

Seine Antworten abhängig davon, welche Version von Perl - und damit, welche Version von Unicode - Sie kann es gegen laufen.

$ 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 

können Sie den corelist -a Unicode Befehl verwenden, um zu sehen, welche Version von Unicode mit, welche Version von Perl geht. Hier wird ausgewählt Ausgabe:

$ 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: Ungültiger Bereich' – kev

+0

@kev Ich habe ganz explizit gesagt, dass ich die '\ x {HHHHHH}' Notation benutzt (was Vim macht) nicht verstehen), so dass ich beliebige Codepunkte in jeder Ebene spezifizieren kann, nicht nur im BMP, wie '\ uHHHH' (was Vim versteht) vorsieht. Es war notwendig, dies zu tun, um das Problem zu verstehen. – tchrist

+0

@kev Java7 verwendet diese Notation auch für seine Regexes. Dies ist für Codepunkte erforderlich, die über dem BMP liegen. Beachten Sie, dass die von Ihnen akzeptierte Antwort die Nicht-BMP-Bereiche in '\ p {Han}' ignoriert, die ab Unicode v6.1 20000-2A6D6, 2A700-2B734, 2B740-2B81D und 2F800-2FA1D sind. Möchten Sie das Programm, das ich geschrieben habe, das diese Bereiche für Sie generiert? – tchrist

4

Es scheint, dass Vim Bereiche irgendwie auf das gleiche hohe Byte beschränkt sind, weil /[\u4E00-\u4eFF] gut funktioniert. Wenn Sie nicht das Chaos kümmern, versuchen:

/[\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

Dies ist eine gute Lösung. Vielen Dank. – kev

+0

Vim friert ein, wenn ich dieses Muster suche. Aber ich arbeite. Danke noch einmal! – kev

+1

@kev Ja, es wird in der Hilfe erklärt: Wenn Sie eine Sammlung verwenden, wird das Zeichen, das auf Übereinstimmung geprüft werden soll, mit allen * Zeichen * in der Sammlung verglichen. Es wird nicht überprüft, ob es in einem bestimmten Bereich ist. Also führt der obige Regex zwanzigtausendneunhundertzehn Überprüfungen für jedes Zeichen durch. Natürlich gefriert vim. – ZyX

3

Ich spielte mit dieser ziemlich viel und in vim Folgendes scheint in meinem Kanji/Pinyin/englischen Text all Kanji-Zeichen zu finden:

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

Vielen Dank, es funktioniert sehr, du bist der Mann. – whitesiroi

2

I don Ich verstehe das "selbe High Byte Problem" nicht, aber es scheint, dass es nicht zutrifft (zumindest nicht für mich, VIM 7.4) wenn Sie tatsächlich den Charakter eingeben, um die Bereiche aufzubauen.

Ich suche normalerweise von U + 3400 (㐀) bis U + 9FCC (鿌), um chinesische Schriftzeichen in japanischen Texten zu erfassen.

  • U + 3400 (㐀) beginnt der "Vereinheitlichte CJK-Ideogramme Erweiterung A"
  • U + 4DC0 - U + 4DFF "Yijing Hexagram Symbols" ist zwischendurch aber nicht aus Gründen der Einfachheit ausgeschlossen.
  • U + 9FCC (鿌) ist das Ende der „CJK Einheitliche Ideogramme“

Bitte beachten Sie, dass die japanische Schrift verwendet „々“ als kanji Wiederholungssymbol, das nicht Teil dieses Blockes ist. Sie finden es im Block "Japanische Symbole und Interpunktion".

/[㐀-鿌] 

A (fast?) Vollständiger Satz von chinesischen Schriftzeichen mit Erweiterungen

/[㐀-鿌豈-龎-] 

Dieser Bereich umfasst:

  • Vereinheitlichte CJK-Ideogramme Erweiterung A
  • Yijing Hexagram Symbols (shouldn‘ t Teil davon sein)
  • CJK Unified Ideographen (Hauptteil)
  • CJK Kompatibilität Ideogramme
  • Vereinheitlichte CJK-Ideogramme Erweiterung B,
  • Vereinheitlichte CJK-Ideogramme Erweiterung C,
  • Vereinheitlichte CJK-Ideogramme Erweiterung D,
  • CJK Kompatibilität Ideogramme Supplement

Bonus für Menschen Arbeiten an Inhalten in japanischer Sprache:

Hiragana geht von U + 3041 bis U + 3096

/[ぁ-ゟ] 

Katakana

/[゠-ヿ] 

Kanji Radicals

/[⺀-⿕] 

japanische Symbole und Interpunktion.

Beachten Sie, dass dieser Bereich auch 々 (Wiederholung des letzten Kanjis) und 〆 (Abkürzung für Shime 「し め」) enthält. Vielleicht möchten Sie sie zu Ihrem Bereich hinzufügen, um Wörter zu finden.

[ -〿] 

Verschiedene japanische Symbole und Zeichen

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

Alphanumeric und Interpunktion (Full Width)

[!-~] 

Quellen:

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

Vielen Dank für Hiragana & Katakana. – whitesiroi

0

In einigen einfachen Fällen suche ich nach chinesischen Schriftzeichen. Es entspricht auch japanischen, russischen Zeichen und so weiter.

[^\x00-\xff] 
Verwandte Themen