我有一个字符串,例如:
"Xin chao moi nguoi"
我想以编程方式将该字符串转换为:
"Xin chào mọi người"
我只需要一个粗略的想法如何开始研究。有什么建议吗?
这不是翻译。下面的两个字符串都来自一种语言,但第一个字符串缺少变音符号。该程序会将变音符号添加到英文字母中。
a
->ă
我不确定是否有特定的库可以解决您的情况,但我不熟悉 Ruby 中的所有内容。但是,您可以尝试以下方法:
创建特殊编码单词的列表,以及基本字符到复杂字符的映射。
然后,当您对候选词进行基本编码时,逐个字符地过滤列表中匹配的词,保留那些与当前字符完全匹配的词,或者在先前定义的映射中有可接受的替代词.
一个快速而肮脏的例子:
wordList = ['chào', 'chao', 'chaobella'] #etc...
charMap = {'a'=>['a', 'à'], 'c'=>['c'], 'h'=>['h'], 'o'=>['o', 'ọ', 'ờ']} # etc...
word = 'chao'
filterList = wordList
# for each character in the word
word.split("").each_with_index do |char, index|
# get the list of characters you'd like it to match
matchingChars = charMap[char]
# select the words that match at this index
filterList = filterList.select{ |w| matchingChars.include? w.split("")[index] }
end
# filter out longer words
filterList = filterList.select{ |w| word.length == w.length }
puts "Words that match: " + filterList.join(",")
您仍然需要将其分解为一个函数,并确定如果有多个匹配的单词该怎么做。
您可以使用Unicode 组合字符并从其基本字符组合生成的字符:
a + ̀ = à
U+0061 + U+0300
您可以通过Unicode分解得到组合字符,即规范化形式规范分解(NFD)。反之,将多个字符组合成一个字符,是规范化形式规范组合(NFC)。
您可以使用这个 Ruby Unicode 库进行组合和分解。
对于一对一的字符转换,有tr方法:
#encoding: utf-8
p "Xin chao moi nguoi".tr('aou', 'àọư')
#=>"Xin chàọ mọi ngưọi"
取决于你想做多少。如果你只是用 UTF-8 编码你的字符串(以 开始你的文件#encoding: utf-8
),你可以制作一个基本的更改字典:
conversions = {
"a" => "á",
"e" => "é"
}
#And so on... (or with words, as @Hannele said)
str.gsub(/[aeiou]/, conversions)
随意将任何转换替换为您认为合适的方式。但是请记住,这将替换字符串中的所有元音。它不会做对人类语言有意义的事情。
您正在将英语翻译成越南语。
一个使用 google api 将字符串从一种语言翻译成另一种语言的 Ruby gem 。