数据处理——片假名→平假名转换算法
前几天完成了一个需求,需要编写算法实现将数据集中的所有包含片假名的数据全部转换成平假名。经过调查发现,在日语中的片假名包含全角片假名、全角片假名(小号)半角片假名、片假名读音扩展这些种类的片假名。需求要求在大量数据转换过程中不可以将其他数据丢失,例如其中包含的其他字符不需要转换,但是也不可以丢失。因此我考虑到算法应该有识别数字、英文字母、空格、平假名、片假名、以及日文中的繁体字等功能。这就要明确这些字符在数据集中所占的字节长度,在此之后考虑应该建立对照表的方法完成需求。因为在数据集中的字符串是以多字节方式存储,而在编译环境中是以单字节存储,所以如果将对照表直接初始化在编译环境中,会产生字节长度不同的冲突,无法实现对应转换需求。
基于此,我尝试过将数据集中的字符串转换成单字节,此处用到了READ_ConvStringToStringEx函数,有关这方面的知识大家可以查询MultiByteToWideChar函数与WideCharToMultiByte函数的实现原理,我就不赘述了。但是在这里又遇到了困难,就是当将其转换后便无法判断字符串中字符所占内存长度,因为该方法只对多字节字符串有效。至此,只能再次更改解决方案。
最后我想到了使用外部文件导入方式,当将对照表以外部文件的形式导入时,我就可以自己定义编码方式,而在编译环境中由于没有调查清楚日文的编码方式,因此就没有实现将编译环境中的单字节字符串转化成多字节字符串的功能,基于此我的对照表建立与业务调查基本结束。接下来进行算法编写,其中数据集中与对照表中的编码方式均为UTF-8的编码方式,我们都知道,UTF-8的编码方式下字节表示是这样的:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
其中所有片假名所占字节数均为3,因此我编写了识别算法,让获取到的数据进入循环后可以根据长度判定是需要转换还是直接截取。以下是根据字符串下标判断该元素所占内存长度方法。

if (0x00 == (strInput.at(i) & 0x80))//1字节
else if ((strInput.at(i) & 0x80 && strInput.at(i) & 0x40 && strInput.at(i) & 0x20) == 0x00)//2字节
else if ((strInput.at(i) & 0x80) &&(strInput.at(i) & 0x40) &&(strInput.at(i) & 0x20) &&(strInput.at(i) & 0x10) == 0x00)//3字节
else if ((strInput.at(i) & 0x80) &&(strInput.at(i) & 0x40) &&(strInput.at(i) & 0x20) &&(strInput.at(i) & 0x10) &&(strInput.at(i) & 0x08) == 0)//4字节

0x80 1000 0000
0x40 0100 0000
0x20 0010 0000
0x10 0001 0000
0x08 0000 1000
如果是长度为3字节,就会进入我编写的几个循环中,因为考虑到算法的性能,我将命中率高的循环语句放置的较为靠前,并且如果在命中后就不会继续再进入其他循环,以提高性能。因为数据集中存在着同为三字节却并非是片假名的字符,因此要多加一个判定以便确保数据不会丢失。并且大家在编程时要注意每次在进入下次循环前要记得将i值向后偏移相应的长度,并且要判断i值与获取的字符串的长度关系,当两者相等时需要结束算法的最外层循环,否则会有中断。至此,算法完成,在测试时又遇到了很多问题,设置了很多断点调试,最后终于也都解决了,需求成功实现。源代码就不放了。。

数据处理——片假名→平假名转换算法相关推荐

  1. gps84转换gcj02公式_地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法

    import java.util.HashMap; import java.util.Map; /** * 地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法 * * @au ...

  2. 地址转换算法 C++实现

    操作系统模拟之地址转换算法. 文件共3份,其中1份cpp,2份.h,代码如下: main.cpp #include "init.h"int main() {printf(" ...

  3. java集合——集合与数组间的转换+算法

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--集合与数组间的转换+算法 的相关知识: 0.2) for full sour ...

  4. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)...

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中. Excel的多个Sheet对应页面的多个Tab选项卡. 转换算法的难点在于,如何处理行列合并,将E ...

  5. MATLAB | sRGB图像的灰度转换算法

    列举了几种常见的灰度转换算法,通过计算结构相似性参数评价不同转换方式所得到灰度图片之间的相似性,并绘制了不同灰度图片之间的差异. % gray_convert.m % sRGB图像转换为灰阶图 Rr ...

  6. 进制转换算法(通用,极简)

    检索词: ​ 进制转换.通用进制转换.二进制转十进制.二进制转八进制.二进制转十六进制. ​ 十进制转二进制.十六进制转二进制.八进制转二进制.通用算法.字符型输入输出 一.英文先行 英文 中文 缩写 ...

  7. 关于五十音 片假名 平假名

    五十音图相当于英语中的二十六字母表 是日语里面的清音 日语里面还有浊音 拗音 促音(停顿音) 每一个平假名都有唯一一个对应的片假名 平假名相当于英语字母表的大写字母 这个在日本人书面语上和日常生活上用 ...

  8. 迅雷7 down.php,普通文件与迅雷、旋风、快车、RayFile的下载地址转换算法

    普通文件与迅雷.旋风.快车.RayFile的下载地址转换算法 我们平时在网上寻找资源时,都看到一些网站里特别标明分开,用迅雷下载:用旋风下载:用快车下载等这些标签,如迅雷,我们常常会见到类似于如下的链 ...

  9. Racket实现数字与中文的转换算法三(程序测试)

    前面两篇介绍了阿拉伯数字与中文数字之间的互相转化.详情请见: Racket实现数字与中文的转换算法一(阿拉伯数字转换为中文数字)--https://blog.csdn.net/chinazhangyo ...

最新文章

  1. Cocos2d-x3.0 DrawNode吸取
  2. 什么是saashrm
  3. 【Python】from __future__ import absolute_import的作用
  4. java开发属于后端吗,值得一读!
  5. windows程序消息机制(Winform界面更新有关)
  6. Memcache for Windows
  7. Android百度地图开发之开发第一个小应用,显示基础的地图页面
  8. oracle连接中出现错误ORA-12541,ORA-12514,ORA-01017的解决方法
  9. Spark源码分析之二:Job的调度模型与运行反馈
  10. 哪种云计算机能玩游戏,低配置电脑的福音,体验腾讯START云游戏:只要有网就能玩这几个游戏,除了Mac版还有Win版!...
  11. pycharm 光标突然变粗,无法正常书写
  12. Acne Scarring Treatment
  13. 西门子博图指令(位逻辑运算指令二)
  14. 三星被指盗取FinFET芯片专利技术 将被起诉
  15. Unity 开关门脚本
  16. 安卓保存数据之onsaveInstanceStace(Bundle outState)的使用
  17. 驾驶技师用计算机考试咋答题,驾驶考试科目一答题技巧
  18. 【沐风老师】为你推荐18个免费3dMAX插件和脚本
  19. 电商观点:网络导购走入大繁荣时代
  20. npm包 semver模块【语义化版本号】

热门文章

  1. 豆瓣FM-wordpress
  2. mycat分库分表demo
  3. 汽车外观造型设计的A级曲面概念
  4. spine教程入门(不错的教程博客)
  5. 【Android】安卓SDK出错的解决办法
  6. HTML二维试衣游戏,基于HTML5实现的在线3D虚拟试衣系统(试衣间)解决方案-Go语言中文社区...
  7. Joins – NLJ
  8. 三本计算机专业就业状况,2021三本什么专业就业前景好
  9. OSSEC,免费和开源IDS
  10. [附源码]计算机毕业设计springboot高校体育场馆管理系统