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

本文介绍了一个简单的Java程序,用于检测文本是否包含维文、哈萨克文或柯尔克孜文。程序通过统计Unicode字符集中的特定字符比例来判断文本所属语言,对于少数民族语言提供了自定义字符集。程序包括枚举类Lang、字符集定义以及检测方法。
摘要由CSDN通过智能技术生成

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

已经有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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值