天天看点

平假名与片假名 相互转换python3:RUBY

python3:

  • 编码:python3 支持UTF-8, 还搞了个 unicode (这是好东西)
  • 通过 unicode进行 字符转换
#转换原理
from six import unichr
str1 = "\u3041"  # 代表一个字符:即 あ
code = ord(str1)  # 获取该字符的 unicode 值-->一个int 类型的值,可进行加减
print(code, type(ord(str1)))  # 12353 <class 'int'> 值和类型
# unicode 值加1: 该字符的下一个字符:  あ + 1-->い
print(chr(code + 1))  # ord(str1)+1 :代表该字符的下一个字符的unicode 值
print(chr(code + 1))  # chr() 把unicode转换成字符
print(unichr(code + 1))  # unichr()与 chr()作用相同:具体差别百度吧
           

懂了python3的 unicode 转换,那剩下的就好办了,

平假名范围:"\u3041", “\u3096”

片假名范围: “\u30A1”, "\u30F6"

字符编码查询
  • 片假名与平假名转换:

    两种思路:

  • 一:
    • ord(平)+ x =ord(片),只要知道中间 差值 x ,就可以明白字符 的unicode对应关系
    • 例如假设 A , a unicode 插值为:10
    • - //没写ord(),应该明白是他们对应的 unicode 值进行加减
                 
    • 即: a + 10 =A , A - 10 = a
    • 可以推出: b+10=B,c + 10=C
    • 平假名范围:"\u3041", “\u3096”
    • 片假名范围: “\u30A1”, “\u30F6”
    • 知道范围了,分别遍历呗,便利结果存到字典里,字典查询,直接哦耶~

这里贴出第二种思路(第一种太简单)

#参数: 平假名起始,结束, 片假名起始,结束  
#返回值: 一个包含两个字典的数组
def make_dic(Hiragana, endH, Katakana, endK):
    dic = {}
    start1, end1 = ord(Hiragana), ord(endH)#先转换成对应  unicode值,用于后续计算
    start2, end2 = ord(Katakana), ord(endK)
    
    num = 0  # 用于计数
    #实际上 这个key没啥用,因为  start1,  start2,等不是从零开始的
    #for key in range(end2-start2):  # 85个数
    # dic[chr(start1 + key)] = chr(start2 + key)

    for key in range(start2, end2):  # 85个数 
        dic[chr(start1 + num)] = chr(start2 + num)
        #解释: 例如 ABCDEFG与 abcdefg
        # 字典添加元素: dic[A]=a  A 与a 对应
        # A +1 与 a + 1 对应 (unicode) --》B 与 b
		#来个循环就把 所有元素都对应起来了
        num += 1

    ldict = dict(zip(dic.values(), dic.keys()))  # 字典倒转
    return [dic, ldict]  #  返回一个包含两个字典的数组

def check_chart(input_str, arr):
    for v in input_str:#字符数组里的单个字符
        print(v, end=" : ")
        if v in arr[0]:#arr[0]— {平:片} 字典,判断是否在字典里,有的话输出
            print(arr[0][v])
        elif v in arr[-1]:#arr[-1]— {片:平} 字典,上面字典没有就在这个字典寻找,
            print(arr[-1][v])


input_str = input("输入:\n")#从控制台输入 一串 假名,不能有换行
# 平假名范围,片假名范围:范围一样, 元素对应
arr = make_dic("\u3041", "\u3096", "\u30A1", "\u30F6")
check_chart(base_str, arr)
           

运行结果:

-

平假名与片假名 相互转换python3:RUBY

RUBY

之所以讲RUBY。。因为它太方便了

Python3 转字节 转其他编码 不能直接加减 得到其他字符(正则和进制 就算了,不会呀),所以用unicode

ruby可以直接在 字符范围 间 遍历,不需要格外 转码

def show_info
   #平假名范围:"\u3041", "\u3096" 
  for index in "\u3041".."\u3096" do
    printf index
  end
  puts "\n"
  #片假名范围: "\u30A1", "\u30F6"
  for index in "\u30A1".."\u30F6" do
    printf index
    # print index
  end
end
show_info
           
平假名与片假名 相互转换python3:RUBY

贼方便,后面搞个字典把它们对应起来,控制台输入判断,得出结果,哦了~

ruby有字典反转的函数:hash.invert 创建一个新的 hash,倒置 hash 中的 keys 和values

后续搞个 循环,不用每次匹配完都要重新点击运行

注意:

  • ruby 在windows下中文日文 会乱码(有的是输出正常,输入乱码)
  • 测试: 新建一个.rb 文件: puts gets.chomp #打印输入的字符

解决方法:

  • 文件头部 加 utf-8 注释,文件头加 GBK编码,系统改成 utf8

    结果。。随机

    (反正我没成功,转到 Linux 【默认使用utf-8 编码,贼舒服】)

用其他语言都差不多,关键就是一个字符转换问题,哎,溜了溜了