如何在文档中标记所有CJK文本?

Vil*_*age 5 unicode multilingual cjk character-properties

我有一个文件,file1.txt包含英文,中文,日文和韩文文本.为了在ConTeXt中使用,我需要根据语言标记文件中的每个文本区域(英语除外),并输出一个新文件,例如,这里是一个示例行:

The ?? ate ?.
Run Code Online (Sandbox Code Playgroud)

因为它包含中文字符的文本,所以这将标记为:

The \language[cn]{??} ate \language[cn]{?}.
Run Code Online (Sandbox Code Playgroud)
  • 该文档保存为UTF-8.
  • 应标明中文文字\language[cn]{*}.
  • 应标记日语文本\language[ja]{*}.
  • 应标记韩文文本\language[ko]{*}.
  • 内容永远不会从一行继续到下一行.
  • 如果代码对某些东西是中文,日文还是韩文有疑问,最好是默认为中文.

如何根据语言标记文本?

dax*_*xim 6

一个粗略的算法:

use 5.014;
use utf8;
while (<DATA>) {
    s
        {(\p{Hangul}+)}
        {\\language[ko]{$1}}g;
    s
        {(\p{Hani}+)}
        {\\language[zh]{$1}}g;
    s
        {(\p{Hiragana}+|\p{Katakana}+)}
        {\\language[ja]{$1}}g;
    say;
}

__DATA__
The ?? ate ?.
The ?? ate ?.
The ?????? ate ??.
The ?? ate ???.
Run Code Online (Sandbox Code Playgroud)

(另请参阅使用perl检测中文字符?)

有问题.Daenyth评论说,例如恐竜被误认为是中国人.我发现你不太可能真正使用混合英语 - CJK,并且只是给出了不好的示例文本.首先进行词法分析,以区分中文和日文.


wul*_*ang 5

我想提供一个Python解决方案.无论使用哪种语言,它都基于Unicode脚本信息(来自Unicode数据库,也称为UCD).与Python相比,Perl具有相当详细的UCD.
Python没有在其"unicodedata"模块中打开脚本信息.但有人在这里添加了它https://gist.github.com/2204527(微小且有用).我的实施基于它.顺便说一句,它不是空间敏感的(不需要任何词法分析).

    # coding=utf8
    import unicodedata2
    text=u"""The??ate?.
    The ??ate ?.
    The?????? ate ??.
    The?? ate ???. """

    langs = {
    'Han':'cn',
    'Katakana':'ja',
    'Hiragana':'ja',
    'Hangul':'ko'
    }

    alist = [(x,unicodedata2.script_cat(x)[0]) for x in text]
    # Add Last
    alist.append(("",""))
    newlist = []
    langlist = []
    prevlang = ""
    for raw, lang in alist:
        if prevlang in langs and prevlang != lang:
            newlist.append("\language[%s]{" % langs[prevlang] +"".join(langlist) + "}")
            langlist = []

        if lang not in langs:
            newlist.append(raw)
        else:                      
            langlist.append(raw)
        prevlang = lang

    newtext = "".join(newlist)
    print newtext
Run Code Online (Sandbox Code Playgroud)

输出是:

    $ python test.py 
    The\language[cn]{??}ate\language[cn]{?}.
    The \language[cn]{??}ate \language[cn]{?}.
    The\language[ja]{??????} ate \language[ja]{??}.
    The\language[ko]{??} ate \language[ko]{???}.
Run Code Online (Sandbox Code Playgroud)