对于特定语言的检测并不是一个困难的问题:统计一段文字中有多少个字符落在某语言的基本语素集合(例如:中文中的声韵母)中,然后计算比例,就可以给出答案。

已经有ibm的icu在这方面做得很好,而且计算速度很快。但是对于少数民族的语言并未全部提供支持,譬如维文、柯尔克孜文。

因为icu复杂性较高,研究通透,再做二次开发需要一段时间。为了满足当前简单的需求,手写了一个简单的检测程序。原理同上,但是其中的代码有一部分或许对以后的

自己和正在阅读的你有一些参考价值。

//枚举类:lang的类型

public enum Lang {

WEI,HARZ,KERZ,Not_Wei

}

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import java.lang.reflect.Array;

import java.util.Arrays;

public class TestDetector {

//所有维文、柯尔克孜文的unicode字符集

static int[] HugeMap ={0x0626,0x0627,0x0628,0x062a,0x062c,0x062d,0x062e,0x062f

,0x0631,0x0632,0x0633,0x0634,0x0639,0x063a,0x0641,0x0642,0x0644,0x0645,0x0648,

0x0649,0x064a,0x0675,0x0676,0x0677,0x0678,0x067e,0x0686,0x0698,0x06ad,0x06af,

0x06be,0x06c5,0x06c6,0x06c7,0x06c8,0x06c9,0x06cb,0x06d0,0x06d5};

//维文独有的字符集

static int[] WeiMap = {0x0698,0x062e,0x063a};

//static int[] HazahMap = {0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x};

//柯尔克孜文独有的字符集

static int[] Kerzmap= {0x06c5,0x06c9,0x0649,0x0626};

private static Lang checkWei(String content) {

byte[] probuffer=null;

try {

//UTF-8 to Unicode

probuffer = utf2uni(content.getBytes("UTF-8"),content.getBytes("UTF-8").length);

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

int weiTotal = 0;

int wei =0;

int hazarh = 0;

int kerz =0;

for (int i = 0; i < probuffer.length; i+=2) {

int high = probuffer[i+1]&0xff;

int low =probuffer[i]&0xff;

System.out.println("high: " +Integer.toHexString(high));

System.out.println("end: "+Integer.toHexString(low));

int c = (high<<8)|(low&0xff);

if( locate(c,HugeMap)){

weiTotal++;

}

if(locate(c, WeiMap)){

wei++;

}

// if(locate(c, HazahMap)){

//哈萨克文的unicode字符集(0x0401 0x0491)

if(0x0491>=c&&c>=0x0401){

hazarh++;

}

if (locate(c,Kerzmap)) {

kerz++;

}

}

System.out.println("isWei: " +weiTotal/(probuffer.length/2.0) );

System.out.println("isHazard: " +hazarh/(probuffer.length/2.0) );

//统计并返回判断结果

if(weiTotal/(probuffer.length/2.0) < 0.7&&hazarh/(probuffer.length/2.0)<0.5) return Lang.Not_Wei;

double weiWeight = wei/(1.0*weiTotal);

double harzarhWeight = hazarh/(1.0*144);

double kerzWeight = kerz/(1.0*weiTotal);

System.out.println("wei: "+weiWeight);

System.out.println("harz: "+harzarhWeight);

System.out.println("karz: "+kerzWeight);

if(kerzWeight*15>=harzarhWeight*12&&kerzWeight*20>=weiWeight*20) return Lang.KERZ;

if(harzarhWeight*12>weiWeight*20&&harzarhWeight*12>=kerzWeight*15) return Lang.HARZ;

return Lang.WEI;

}

private static boolean locate(int c, int[] weiMap) {

System.out.println("c: "+Integer.toHexString(c));

Arrays.sort(weiMap);

return Arrays.binarySearch(weiMap, c)>=0;

}

//实现utf-8向unicode的转码

private static byte[] utf2uni(byte[] buffer,int length) {

int ite=0;

int rslength = 0;

int rsCur=0;

byte[] rsByte = new byte[1024*4*4];

while(ite

//检测当前字符由几个utf-8的byte组成

int n = testByte(buffer[ite]);

//取出byte并实现转码

byte [] temp = getUni(ite,ite+=n,buffer);

//添加到临时数组中

if(temp!=null){

rslength+=temp.length;

for (int i = 0; i < temp.length; i++) {

rsByte[rsCur++] = temp[i];

}

}

}

//处理返回数组,即unicode的字符流

byte[] rs_Byte = new byte[rslength];

for (int i = 0; i < rs_Byte.length; i++) {

rs_Byte[i] = rsByte[i];

}

return rs_Byte;

}

private static byte[] getUni(int b, int e,byte[] buffer) {

byte[] rs = new byte[2];

System.out.print("n: "+(e-b)+" ");

switch(e-b){

case 1:

rs[0] = (byte)(buffer[b]&0x7f);

rs[1] = (byte)(0x0);

return rs;

case 2:

rs[0] = (byte)(buffer[b]&0x3);

rs[0] = (byte)(rs[0]<<6);

rs[0] = (byte)(rs[0]|(buffer[b+1]&0x3f));

rs[1] = (byte)((buffer[b]>>2)&0x7);

return rs;

case 3:

rs[0] = (byte)(buffer[b+1]&0x3);//high 2

rs[0] = (byte)(rs[0]<<6);

rs[0] = (byte)(rs[0]|(buffer[b+2]&0x3f));//low 6

rs[1] = (byte)(buffer[b]&0xf);//high 4

rs[1] = (byte)(rs[1]<<4);

rs[1] = (byte)(rs[1]|buffer[b+1]&0xf);//low 4

return rs;

//case 4: 四字节的不添加到unicode中

}

return null;

}

private static int testByte(byte c) {

System.out.print(Integer.toHexString(c&0xff)+" ");

if((c&0x80)==0) return 1;

else if((c&0x20) ==0 ) return 2;

else if((c&0x10)== 0 ) return 3;

else return 4;

}

public static void main(String[] args) {

String sss=null;

sss="Синьцзян-Уйгурский "+

"автономный район, по сокращению Синьцзян, расположен в середине Евразийского континента"+

"и краю Северо-Западного Китая, общей площадью 1660 тыс кв. "+

"км, что составляет одну шестую всей территории страны. В стране граничит"+

"с Тибетским АР, провинциями Цихай, Ганьсу и т.д. В периферии соответственно граничит с 8 странами: Монголия, Россия, Казахстан, Киргизия, Таджикистан, Афганистан, Пакистан и Индия. Протяженность границ составляет 5600 км, примерно одну четвертую всей государственной границы страны. Так что Синьцзян лидирует по площади, количеству сопредельных стран и протяженности границ на суше Китая."+

"Синьцзян, который в древности назывался Сиюй: Западным краем, исконно является неотъемлемой частью Родины. В 138 году до нашей эры император Ханьуди направил Чжан Цяня в качестве посланца в Западный край. Власть династии Западная Хань установила связь с городами-царствами Западного края. В 60 году до нашей эры власть династии Западная Хань в Улэе(в настоящее время на территории уезда Лунтай)учредила Резиденцию наместника Западного края. С тех пор Западный край официально стал частью территории Династии Хань. В поздний период императора Цинской династии Цяньлун Западный край переименовался в Синьцзян. В 1884 году официально создана провинция Синьцзян, административным центром которой был г. Дихуа(сегодня Урумчи). В 1949 году Синьцзян был мирным путем освобожден. Первого октября 1955 года был провозглашен Синьцзян-Уйгурский автономный район. Административным центром стал г. Урумчи(по-монгольски красивое пастбище)";

sss="爱情喜剧《乌云背后的幸福线》:《迈阿密先驱报》影评人雷内·罗德里格斯评9分,“这是编剧兼导演大卫·欧·拉塞尔的浪漫喜剧电影理念的体现,这部电影很棒,是今年最清新,最幽默和最鼓舞人心的观众宠儿之一。”感谢@揉zHi小Quinn 的精彩翻译";

sss="ھاسىل قىلىندى. ھۆكۈمەت ئۇچۇرىنى ئاشكارىلاش خىزمىتى ئومۇميۈزلۈك قانات يايدۇرۇلۇپ، ھۆكۈمەت ئىشلىرىنى ئاشكارىلاش خىزمىتى سەۋىيىسى يەنىمۇ ئۆستۈرۈلۇپ، ئاشكارا ھۆكۈمەت قۇرۇلۇشىنىڭ ياخشى ۋەزىيىتى بارلىققا كەلدى؛ ئۇچۇر تورى سىستېمىسىنىڭ بىخەتەرلىكى ۋە مەخپىيەتلىكنى ساقلاش خىزمىتى كۈچەيتىلىپ، ئاپتونوم رايونىمىزنىڭ بېيجىڭ ئولىمپىك تەنھەرىكەت مۇسابىقىسى مەزگىلىدىكى ئېلېكترونلۇق مەمۇرىيەت تورى ۋە سىستېمىسىنىڭ مۇقىم، ئىشەنچلىك يۈرگۈزۈلۈشىگە كاپالەتلىك قىلىندى؛ ھۆكۈمەت تور بېكىتى قۇرۇلۇشىدا يېڭى ئىلگىرىلەش بولۇپ، ھۆكۈمەتنىڭ تور مۇلازىمىتى سىستېمىسى يەنىمۇ مۇكەممەللەشتى؛ ئېلېكترونلۇق مەمۇرىيەت مەخسۇس تورى داۋاملىق چوڭقۇر تەرەققىي قىلىپ، تورسىمان خىزمەت سىستېمىسى ئاساسەن قۇرۇلدى؛ تور ئۈستىدە خىزمەت قىلىش ئۈزلۈكسىز ئىلگىرىلەپ، ";

System.out.println(sss);

System.out.println();

Lang isWei =checkWei(sss);

System.out.println("isWei: "+isWei);

}

}

java 维文生成图片_维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)...相关推荐

  1. 维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)

    对于特定语言的检测并不是一个困难的问题:统计一段文字中有多少个字符落在某语言的基本语素集合(例如:中文中的声韵母)中,然后计算比例,就可以给出答案. 已经有ibm的icu在这方面做得很好,而且计算速度 ...

  2. jsp中java代码无效_来杯咖啡,教你如何优雅的在java中统计代码块耗时

    推荐阅读: Sping源码+Redis+Nginx+MySQL等七篇实战技术文档,阿里大佬推荐 阿里内部:2020年全技术栈文档+PPT分享,(万粉总结,回馈粉丝) 在我们的实际开发中,多多少少会遇到 ...

  3. java后端语言_后端程序员一定要看的语言大比拼:Java vs. Go vs. Rust

    这是Java,Go和Rust之间的比较.这不是基准测试,更多是对可执行文件大小.内存使用率.CPU使用率.运行时要求等的比较,当然还有一个小的基准测试,可以看到每秒处理的请求数量,我将尝试对这些数字进 ...

  4. java滥用接口_吐槽一下项目中的代码坏味道:滥用java常量

    我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类. public interface IConstant { int ZERO = 0; St ...

  5. jsp和java使用值_如何将表单的值从jsp发送到Java

    我有一个包含30个不同字段的表格.将它们全部传递给控制器​​时,需要为每个属性都具有一个属性,以及一对getter,setter. 我将使表单字段作为一个对象并将该对象发送到控制器. 我正在使用以下代 ...

  6. java定时任务管理_基于SpringBoot+layui秒级定时任务管理:JTimer for JAVA项目

    一.JTimer for JAVA简介 1.项目介绍 JTimer for JAVA是基于SpringBoot+layui秒级定时任务管理,取代crontab.其PHP版本 https ://gite ...

  7. java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  8. java属于编译_《程序员修炼之道》-读书笔记一-Java到底属于编译型语言还是解释型语言?...

    Java到底属于编译型语言还是解释型语言? 要想知道Java属于编译型语言还是解释型语言我们需要知道他们的定义和区别 定义: 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运 ...

  9. java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子

    点击蓝色"陈树义"关注我哟 网上罗列了很多关于变量的理解,良莠不齐,不知道哪些是对的,哪些是错的.所以笔者索性就这些博客和自己的理解写出这篇文章,如果有不对的地方,希望读者能够指正 ...

最新文章

  1. Linux内核将支持HyperBus
  2. 会议通知|2019年全国高校大数据专业教学研讨与教师培训
  3. 怎么能把你的公司快速做大呢
  4. 我的大学——不忍舍弃的回忆(3)
  5. [转载]生活在 Emacs 中
  6. ssh链接数设置问题
  7. H.264/AVC率失真优化( RDO) 策略研究
  8. LINUX多路IO技术 SELECT VS POLL VS EPOLL
  9. 国际品牌会员俱乐部VTN甄选全球好物 把握消费升级趋势 引领品牌高质量发展
  10. Skype for Business Server前端高可用原理分析
  11. excel合并多个工作表_多个Excel工作表合并到一个工作簿?很简单!
  12. 迷你西游最新服务器是哪个,《迷你西游》新开服务器公告
  13. 学生用计算机怎么调,电脑怎么设置学生模式
  14. 7-156 输出大写英文字母 (15 分)
  15. 用计算机演奏歌曲谱子,我要用计算器弹曲子,求亲们发点计算器简谱
  16. 性别符号php,树也分男女?给6万棵杨树画上性别符号,原来是因为…
  17. excel怎么删除换行符
  18. 怎么把音乐从电脑传到苹果手机?电脑mp3导入苹果手机
  19. ElementUI日期组件(DatePicker )图标定制
  20. 学习篇之华为快应用的开发(一)

热门文章

  1. phabricator安装配置和使用(docker安装和独立部署)
  2. 汇编 一星题目字符串合集:输入字符,操作,在屏幕上显示
  3. 2步判断晶体管工作状态
  4. Hibernate占位符?和:及JPA
  5. 做tab切换时,点击浏览器返回拿不到实时的tab参数,请求不到实时的数据
  6. Linux module 添加到bashrc 和临时ifort编译器 以及python2和3的配置
  7. 用ng-view创建单页APP
  8. java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
  9. (转)windows身份验证登入数据库 iis 无法访问数据库
  10. CSS 控件适配器的菜单样式解释