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)
\language[cn]{*}.\language[ja]{*}.\language[ko]{*}.如何根据语言标记文本?
一个粗略的算法:
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,并且只是给出了不好的示例文本.首先进行词法分析,以区分中文和日文.
我想提供一个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)
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |