命令行中的罗马化通用日语
Romanize generic Japanese in commandline
我想在 bash 命令行上按照标准 Hepburn system 音译通用日语,包括汉字。
我已经评估了几个选项,但是
- Google 翻译器(可通过翻译 Shell 获得)仅在平假名/片假名时准确
- KAKASI 提供 ASCII,但没有音译(所以 Toukyou 而不是 Tōkyō)
所以我想解析 http://nihongo.j-talk.com 的输出
输出在 div.outputwrap 或 div.output
如果纯粹用 Bash 工具(curl / jq?)做这件事是徒劳的,我怎么能用 Python / BeautifulSoup 达到这个目的?
抱歉没有提供代码段,我不知道如何将数据 POST 发送到网站并在没有 API 的情况下使用结果。
查看 http://nihongo.j-talk.com 站点的来源 html,我猜测 API。
以下是步骤:
1) 通过wget向服务器发送一个日语字符串,得到结果在index.html.
2) 解析 index.html 并提取罗马字字符串。
示例代码如下:
#!/bin/bash
string="日本語は、主に日本で使われている言語である。日本では法規によって「公用語」として規定されているわけではないが、各種法令(裁判所法第74条、会社計算規則第57条、特許法施行規則第2条など)において日本語を用いることが定められるなど事実>上の公用語となっており、学校教育の「国語」でも教えられる。"
uniqid="46a7e5f7e7c7d8a7d9636ecb077da485479b66bc"
wget -N --post-data "uniqid=$uiqid&Submit='Translate Now'&kanji_parts=standard&kanji=$string&converter=spaced&kana_output=romaji" http://nihongo.j-talk.com/ > /dev/null 2>&1
perl -e '
$file = "index.html";
open(FH, $file) or die "$file: $!\n";
while (<FH>) {
if (/<div id=.spaced. class=.romaji.>(.+)/) {
($str = ) =~ s/<.*?>//g;
$str =~ s/\&\#(\d+);/&utfconv()/eg;
print $str, "\n";
}
}
# utf16 to utf8
sub utfconv {
$utf16 = shift;
my $upper = ($utf16 >> 6) & 0b0001_1111 | 0b1100_0000;
my $lower = $utf16 & 0b0011_1111 | 0b1000_0000;
pack("C2", $upper, $lower);
}'
一些评论:
- 我用 Perl 编写了解析器,因为它对我来说相当熟悉,但您可以通过阅读 index.html 文件来修改或将其转换为其他语言。
- uniqid 字符串是我从网站的 html 来源中挑选的。如果效果不佳,请确保 html 源代码中嵌入了什么。
希望对您有所帮助。
我想在 bash 命令行上按照标准 Hepburn system 音译通用日语,包括汉字。
我已经评估了几个选项,但是
- Google 翻译器(可通过翻译 Shell 获得)仅在平假名/片假名时准确
- KAKASI 提供 ASCII,但没有音译(所以 Toukyou 而不是 Tōkyō)
所以我想解析 http://nihongo.j-talk.com 的输出 输出在 div.outputwrap 或 div.output
如果纯粹用 Bash 工具(curl / jq?)做这件事是徒劳的,我怎么能用 Python / BeautifulSoup 达到这个目的?
抱歉没有提供代码段,我不知道如何将数据 POST 发送到网站并在没有 API 的情况下使用结果。
查看 http://nihongo.j-talk.com 站点的来源 html,我猜测 API。
以下是步骤:
1) 通过wget向服务器发送一个日语字符串,得到结果在index.html.
2) 解析 index.html 并提取罗马字字符串。
示例代码如下:
#!/bin/bash
string="日本語は、主に日本で使われている言語である。日本では法規によって「公用語」として規定されているわけではないが、各種法令(裁判所法第74条、会社計算規則第57条、特許法施行規則第2条など)において日本語を用いることが定められるなど事実>上の公用語となっており、学校教育の「国語」でも教えられる。"
uniqid="46a7e5f7e7c7d8a7d9636ecb077da485479b66bc"
wget -N --post-data "uniqid=$uiqid&Submit='Translate Now'&kanji_parts=standard&kanji=$string&converter=spaced&kana_output=romaji" http://nihongo.j-talk.com/ > /dev/null 2>&1
perl -e '
$file = "index.html";
open(FH, $file) or die "$file: $!\n";
while (<FH>) {
if (/<div id=.spaced. class=.romaji.>(.+)/) {
($str = ) =~ s/<.*?>//g;
$str =~ s/\&\#(\d+);/&utfconv()/eg;
print $str, "\n";
}
}
# utf16 to utf8
sub utfconv {
$utf16 = shift;
my $upper = ($utf16 >> 6) & 0b0001_1111 | 0b1100_0000;
my $lower = $utf16 & 0b0011_1111 | 0b1000_0000;
pack("C2", $upper, $lower);
}'
一些评论:
- 我用 Perl 编写了解析器,因为它对我来说相当熟悉,但您可以通过阅读 index.html 文件来修改或将其转换为其他语言。
- uniqid 字符串是我从网站的 html 来源中挑选的。如果效果不佳,请确保 html 源代码中嵌入了什么。
希望对您有所帮助。