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)
运行结果:
-
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
贼方便,后面搞个字典把它们对应起来,控制台输入判断,得出结果,哦了~
ruby有字典反转的函数:hash.invert 创建一个新的 hash,倒置 hash 中的 keys 和values
后续搞个 循环,不用每次匹配完都要重新点击运行
注意:
- ruby 在windows下中文日文 会乱码(有的是输出正常,输入乱码)
- 测试: 新建一个.rb 文件: puts gets.chomp #打印输入的字符
解决方法:
-
文件头部 加 utf-8 注释,文件头加 GBK编码,系统改成 utf8
结果。。随机
(反正我没成功,转到 Linux 【默认使用utf-8 编码,贼舒服】)
用其他语言都差不多,关键就是一个字符转换问题,哎,溜了溜了