从列表中删除日语字符的变体

时间:2012-12-07 01:10:46

标签: .net sorting unicode

问题:

在.net(v4.5)中我有一个包含あ, い, う, え, お, か, き, く, け, こ, が, ぎ, ぐ, げ, ご, さ, し, す, せ, そ, ざ, じ, ず, ぜ, ぞ的日语符号列表。

如何从列表中删除拼音变体,请将上面的列表更改为あ, い, う, え, お, か, き, く, け, こ, さ, し, す, せ, そ

C#或VB中的解决方案都没问题。

(请参阅下文,了解我为何尝试这样做的一些信息)

背景:

我有一个MS Access数据库表,其中包含一列中日语的城镇城镇列表,以及相邻列中平假名的读数,如下所示:

町名          ふりがな
------------------------
鵜沼朝日町   うぬまあさひまち
上中屋町     かみなかやちょう
小佐野町     こざのちょう
下切町       しもぎりちょう

町名是镇名,ふりがな是平假名的读物。

我需要显示一个表格,以便搜索地区列表。

当前有一个系统(用VB.NET编写),用户从阅读中选择第一个符号(平假名),然后获取名称以该符号开头的城镇列表供选择

我正在更新该系统并且认为我可以大大简化现有代码,但是遇到了麻烦......

我正在使用以下查询列出第一个阅读符号

SELECT DISTINCT LEFT([ふりがな], 1) FROM MyTable

适用于获取用户可供选择的第一个符号列表。然后我使用该列表填充我的搜索界面上的winforms下拉列表,用户可以从中选择第一个符号,然后填充包含所有可用城镇的列表框。

我遇到的问题是查询返回所有符号(应该如此),包括语音变化,如が,じ,ぴ等,我实际上并不想在我的列表中,因为日本语音变化通常在分组时被忽略符号。

3 个答案:

答案 0 :(得分:3)

如果没有查找表,您可以利用Unicode规范化。

如果您将带有变音符号(包括日语浊音标记)的字母标准化为普通表格D,您将获得一个分解的基本字母并结合变音符号。只要拿下第一个角色就可以得到你想要的东西。

name.Normalize(NormalizationForm.FormD).Substring(0, 1)

答案 1 :(得分:0)

Dim x As New List(Of Char) ''containing the chars to be removed
For Each y In x
    queryresult.Replace(y, "")
Next

如果您知道哪个是:

Dim phonetics As New List(Of Char)
Dim actuals As New List(Of Char)
For i = 0 To phonetics.Count - 1
     queryresult.Replace(phonetics(i), actuals(i))
Next

另一种方式是:

Dim actual As String = queryresult.Split(" ")(0)

答案 2 :(得分:0)

好的,我想出了办法。 Katakanas可以转换为单字节charatacters,这导致单字节假名和修改器的第二个单字节(日语中的“dakuten”)。

因此,可以通过这样的检查(在VB中)

从列表中删除修改后的kanas
if StrConv(StrConv(kana, VbStrConv.Katakana), VbStrConv.Narrow).Length > 1 then
    ...
end if

任何长度大于1的字符串都是修改后的声音。

转换C#变得更加棘手,但原则是相同的。这不适用于平假名,因为它们不能是半宽的,所以首先进行片假名转换是非常重要的。

相关问题