如何在英文字母中添加变音符号

时间:2013-01-18 14:20:41

标签: ruby unicode

我有一个字符串,例如:

"Xin chao moi nguoi"

我想以编程方式将该字符串转换为:

"Xin chào mọi người"

我只是需要一个粗略的想法如何开始研究。有什么建议吗?

这不是翻译。下面的两个字符串都来自一种语言,但第一种语言错过了变音符号。这个程序会将变音符号添加到英文字母中。

a - > ă

5 个答案:

答案 0 :(得分:3)

我不确定是否有一个特定的库可以解决您的情况,但我不熟悉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(",")

您仍然需要将其分解为一个函数,并确定如果有多个匹配的单词该怎么办。

答案 1 :(得分:2)

您可以使用Unicode combining characters并从其基本字符组成结果字符:

   a   +   ̀      = à
U+0061 + U+0300

您可以使用Unicode decomposition获取组合字符,即规范化格式Canonical Decomposition (NFD)。将单个字符组成多个字符的反转是规范化形式Canonical Composition (NFC)。

您可以使用this Ruby Unicode library进行合成和分解。

答案 2 :(得分:1)

取决于你想做多少。如果你只是用UTF-8编码你的字符串(用#encoding: utf-8开始你的文件),你可以做一个基本的改变字典:

conversions = {
  "a" => "á",
  "e" => "é"
}
#And so on... (or with words, as @Hannele said)
str.gsub(/[aeiou]/, conversions)

您可以根据自己的需要更换任何转换。但请记住,这将取代字符串中的所有元音。它不会对人类语言有意义。

答案 3 :(得分:1)

对于一对一的char转换,有tr方法:

#encoding: utf-8
p "Xin chao moi nguoi".tr('aou', 'àọư')
#=>"Xin chàọ mọi ngưọi"

答案 4 :(得分:-1)

您正在将英语翻译成越南语。

Ruby gem使用google api将字符串从一种语言翻译成另一种语言。