1 翻译器的意义
我国有视障人士2000多万人,需要把大量的文章与书籍转换成盲文书。
2 翻译器的开发原理
根据汉语与盲文符号的对照表,以此为基础,进行汉字与盲文之间的转换。
如下的两个图片是汉语与盲文符号的对照表。
3 翻译器的开发示例代码
html
<HTML>
<HEAD>
<TITLE> 汉字生成盲文第一版 </TITLE>
<meta charset="gb2312">
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script src='zh_character_to_pinyin_character_with_tone_map.js'></script>
</HEAD>
<BODY onkeypress='key_operation()'>
<p id="p1">生成盲文的方法</p>
<p>在左边的方框内,输入一段话,再点击生成盲文的按钮,在画布上就生成了盲文</p>
<textarea id='txt5' rows="5" cols="140"></textarea>
<input type='button' value='生成盲文' onclick='print_braille()'></input>
<textarea id='txt6' rows="5" cols="140"></textarea>
<canvas id="myCanvas" width="600" height="300" style="background-color:blue;border: 10px yellow solid" ></canvas>
<p>
<input type='button' value='q' onclick='input("q")'></input>
<input type='button' value='w' onclick='input("w")'></input>
<input type='button' value='e' onclick='input("e")'></input>
<input type='button' value='r' onclick='input("r")'></input>
<input type='button' value='t' onclick='input("t")'></input>
<input type='button' value='y' onclick='input("y")'></input>
<input type='button' value='u' onclick='input("u")'></input>
<input type='button' value='i' onclick='input("i")'></input>
<input type='button' value='o' onclick='input("o")'></input>
<input type='button' value='p' onclick='input("p")'></input>
<input type='button' value='[' onclick='input("[")'></input>
<input type='button' value=']' onclick='input("]")'></input>
<input type='button' value='\' onclick='input("\")'></input>
</p>
<p>
<input type='button' value='a' onclick='input("a")'></input>
<input type='button' value='s' onclick='input("s")'></input>
<input type='button' value='d' onclick='input("d")'></input>
<input type='button' value='f' onclick='input("f")'></input>
<input type='button' value='g' onclick='input("g")'></input>
<input type='button' value='h' onclick='input("h")'></input>
<input type='button' value='j' onclick='input("j")'></input>
<input type='button' value='k' onclick='input("k")'></input>
<input type='button' value='l' onclick='input("l")'></input>
<input type='button' value=';' onclick='input(";")'></input>
<input type='button' value='' onclick='input("")'></input>
<input type='button' value='enter' onclick='input("10")'></input>
</p>
<p>
<input type='button' value='z' onclick='input("z")'></input>
<input type='button' value='x' onclick='input("x")'></input>
<input type='button' value='c' onclick='input("c")'></input>
<input type='button' value='v' onclick='input("v")'></input>
<input type='button' value='b' onclick='input("b")'></input>
<input type='button' value='n' onclick='input("n")'></input>
<input type='button' value='m' onclick='input("m")'></input>
<input type='button' value=',' onclick='input(",")'></input>
<input type='button' value='.' onclick='input(".")'></input>
<input type='button' value='/' onclick='input("/")'></input>
</p>
<script>
var e=document.getElementById("myCanvas");
var cxt=e.getContext("2d");
cxt.fillStyle="#FF0000";
cxt.fillRect(0,0,50,5);
var first_sound=[[[[1,0],[1,0],[0,0]],'b'],
[[[1,1],[1,0],[1,0]],'p'],
[[[1,1],[0,0],[1,0]],'m'],
[[[1,1],[1,0],[0,0]],'f'],
[[[1,1],[0,1],[0,0]],'d'],
[[[0,1],[1,1],[1,0]],'t'],
[[[1,1],[0,1],[1,0]],'n'],
[[[1,0],[1,0],[1,0]],'l'],
[[[1,1],[1,1],[0,0]],'g'],
[[[1,1],[1,1],[0,0]],'j'],
[[[1,0],[0,0],[1,0]],'k'],
[[[1,0],[0,0],[1,0]],'q'],
[[[1,0],[1,1],[0,0]],'h'],
[[[1,0],[1,1],[0,0]],'x'],
[[[0,1],[0,0],[1,0]],'zh'],
[[[0,1],[0,0],[1,0]],'zhi'],
[[[1,1],[1,1],[1,0]],'ch'],
[[[1,1],[1,1],[1,0]],'chi'],
[[[1,0],[0,1],[0,1]],'sh'],
[[[1,0],[0,1],[0,1]],'shi'],
[[[0,1],[1,1],[0,0]],'r'],
[[[0,1],[1,1],[0,0]],'ri'],
[[[1,0],[0,1],[1,1]],'z'],
[[[1,0],[0,1],[1,1]],'zi'],
[[[1,1],[0,0],[0,0]],'c'],
[[[1,1],[0,0],[0,0]],'ci'],
[[[0,1],[1,0],[1,0]],'s'],
[[[0,1],[1,0],[1,0]],'si']];
var last_sound=[[[[0,0],[0,1],[1,0]],'a'],
[[[0,0],[1,0],[0,1]],'o'],
[[[0,0],[1,0],[0,1]],'e'],
[[[0,1],[1,0],[0,0]],'yi'],
[[[0,1],[1,0],[0,0]],'i'],
[[[1,0],[0,0],[1,1]],'wu'],
[[[1,0],[0,0],[1,1]],'u'],
[[[0,1],[0,0],[1,1]],'yu'],
[[[0,1],[0,0],[1,1]],'v'],
[[[1,0],[1,1],[1,0]],'er'],
[[[0,1],[1,0],[0,1]],'ai'],
[[[0,0],[1,1],[1,0]],'ao'],
[[[0,1],[1,0],[1,1]],'ei'],
[[[1,0],[1,1],[1,1]],'ou'],
[[[1,1],[1,0],[0,1]],'ya'],
[[[1,1],[1,0],[0,1]],'ia'],
[[[0,1],[0,1],[1,0]],'yao'],
[[[0,1],[0,1],[1,0]],'iao'],
[[[1,0],[0,1],[0,0]],'ye'],
[[[1,0],[0,1],[0,0]],'ie'],
[[[1,0],[1,1],[0,1]],'you'],
[[[1,0],[1,1],[0,1]],'iou'],
[[[1,1],[1,1],[1,1]],'wa'],
[[[1,1],[1,1],[1,1]],'ua'],
[[[1,1],[0,1],[1,1]],'wai'],
[[[1,1],[0,1],[1,1]],'uai'],
[[[0,1],[1,1],[0,1]],'wei'],
[[[0,1],[1,1],[0,1]],'uei'],
[[[1,0],[0,1],[1,0]],'wo'],
[[[1,0],[0,1],[1,0]],'uo'],
[[[0,1],[1,1],[1,1]],'yue'],
[[[0,1],[1,1],[1,1]],'ve'],
[[[1,0],[1,0],[1,1]],'an'],
[[[0,0],[1,0],[1,1]],'ang'],
[[[0,0],[0,1],[1,1]],'en'],
[[[0,1],[0,1],[1,1]],'eng'],
[[[1,1],[0,0],[0,1]],'yan'],
[[[1,1],[0,0],[0,1]],'ian'],
[[[1,1],[0,0],[1,1]],'yang'],
[[[1,1],[0,0],[1,1]],'iang'],
[[[1,0],[1,0],[0,1]],'yin'],
[[[1,0],[1,0],[0,1]],'in'],
[[[1,0],[0,0],[0,1]],'ying'],
[[[1,0],[0,0],[0,1]],'ing'],
[[[1,1],[1,1],[0,1]],'wan'],
[[[1,1],[1,1],[0,1]],'uan'],
[[[0,0],[1,1],[1,1]],'wang'],
[[[0,0],[1,1],[1,1]],'uang'],
[[[0,0],[1,1],[0,0]],'wen'],
[[[0,0],[1,1],[0,0]],'uen'],
[[[0,0],[1,1],[0,1]],'weng'],
[[[0,0],[1,1],[0,1]],'ong'],
[[[1,1],[1,0],[1,1]],'yuan'],
[[[1,1],[1,0],[1,1]],'van'],
[[[0,1],[0,1],[0,1]],'yun'],
[[[0,1],[0,1],[0,1]],'vn'],
[[[1,1],[0,1],[0,1]],'yong'],
[[[1,1],[0,1],[0,1]],'iong']
];
var tone_number=[32,8,2,10,0,0,0];
var number=[28,32,40,48,52,36,56,60,44,24];
var english_character=[32,40,48,52,36,56,60,44,24,28,34,42,50,54,38,58,62,46,26,30,35,43,29,51,55,39];
var meta_letters=['a','o','e','i','u','v'];
var ch_letters=[[257,225,462,224],[333,243,466,242],[275,233,283,232],[299,237,464,236],[363,250,468,249],[470,472,474,476]];
var braille_array=[];
//translate_en_letters_to_ch_letters('jiong3') jiong3 ----> jǐong
function translate_en_letters_to_ch_letters(str)
{
var position_A=-1;
var position_B=-1;
for(var i=0;i<meta_letters.length;i++)
{
position_A=str.indexOf(meta_letters[i]);
if(position_A>=0)
{if (i==3)
{ position_B=str.indexOf(meta_letters[i+1]);
if(position_B<position_A)
{break;}
else
{position_B=position_A;
i=i+1;
break;}
}
else {break;}
}
}
var re_source_letter=meta_letters[i];
var tone=parseInt(str.charCodeAt(str.length-1),10)-48;
if(tone>0&&tone<=9)
{
var re_target_letter=String.fromCharCode(ch_letters[i][tone-1]);
str=str.replace(re_source_letter,re_target_letter);
str=str.substring(0,str.length-1);
}
return str;
}
/*function test()
{
document.getElementById("txt4").innerText=get_pinyin_code_from_quwei_code(document.getElementById("txt3").innerText);
}*/
function getChsAscii(str)
{
var high=Math.floor(str/100);
var low=parseInt(str%100,10);
return high*256+low+160*257-65536;
}
function input(val)
{
if(val>='a'&&val<='z')
{
document.getElementById("txt3").innerText=document.getElementById("txt3").innerText+val;
}
else if (val=='10')
{
document.getElementById("txt4").innerText=get_pinyin_code_from_quwei_code(document.getElementById("txt3").innerText);
document.getElementById("txt3").innerText='';
}
}
var key_buffer='';
function key_operation()
{
var val=event.charCode;
if(val>=97&&val<=122)
{
key_buffer=key_buffer+event.char;
}
else if (val==13)
{
document.getElementById("txt4").innerText=get_pinyin_code_from_quwei_code(key_buffer);
key_buffer='';
}
}
function getvalue(val){
if (val=='') {return document.getElementById("txt5").value;}
else {return val;}
}
/*
function test()
{
var cc=getvalue(document.getElementById("txt5").innerText);
var str='';
var ch_str='';
var s=0;
var count=0;
for(var i=0;i<pydic.length;i++){
if(pydic.charCodeAt(i)>660){
str+=pydic.charAt(i)+",";
}
}
document.getElementById("txt6").value=str;//get_sound(cc);//
document.getElementById("txt6").innerText=str;//result;
}*/
//get_sound_part('sheng1')----> sh eng 1
function get_sound_part(cc)
{
var first_sound_ch="bpmfdtnlgjkqhx";
var last_sound_ch="wyaeiou";
var result_first='';
var result_last='';
var result_num='';
var str='';
var ch_str='';
var s=0;
var count=0;
var i=0;
if(first_sound_ch.indexOf(cc.charAt(i))!=-1){
s=1;
result_first=cc.charAt(i);
}
else if(cc.charAt(i)=='z'||cc.charAt(i)=='c'||cc.charAt(i)=='s')
{
if(cc.charAt(num_add(i,1))=='h')
{
if(cc.charAt(num_add(i,2))=='i')
{result_first=cc.charAt(i)+cc.charAt(num_add(i,1))+cc.charAt(num_add(i,2));s=3;}
else
{result_first=cc.charAt(i)+cc.charAt(num_add(i,1));s=2;}
}
else if(cc.charAt(num_add(i,1))=='i')
{result_first=cc.charAt(i)+cc.charAt(num_add(i,1));s=2;}
else
{result_first=cc.charAt(i);s=1;}
}
else if(cc.charAt(i)=='r')
{
if(cc.charAt(num_add(i,1))=='i')
{result_first=cc.charAt(i)+cc.charAt(num_add(i,1));s=2;}
else
{result_first=cc.charAt(i);s=1;}
}
else if(last_sound_ch.indexOf(cc.charAt(i))!=-1)
{result_first='';s=0;}
for(var i=s;i<cc.length;i++)
{
if(cc.charCodeAt(i)>64)
{
result_last+=cc.charAt(i);
}
else
{
result_num=cc.charAt(i);
}
}
var front=find_code(first_sound,result_first);
var mid=find_code(last_sound,result_last);
var last=tone_number[result_num-1];
braille_array.push(front);
braille_array.push(mid);
braille_array.push(last);
return front+ ' ' +mid+' '+last;
}
function print_braille()
{
var cc=getvalue(document.getElementById("txt5").innerText);
var str='';
var single_str='';
var ch_str='';
var s=0;
var count=0;
braille_array=[];
for(var i=0;i<cc.length;i++){
if(pydic.indexOf(cc.charAt(i))!=-1&&cc.charCodeAt(i)>200){
s=1;
single_str='';
while(pydic.charAt(pydic.indexOf(cc.charAt(i))+s)!=","){
single_str+=pydic.charAt(pydic.indexOf(cc.charAt(i))+s);
s++;
}
str+=get_sound_part(single_str); //进行了音节分离
str+=" ";
ch_str+=cc.charAt(i)+times2(' ',s-2);
count+=s;
}
else if (cc.charCodeAt(i)==13||cc.charCodeAt(i)==10||count>70){
str+=cc.charAt(i)+String.fromCharCode(13)+String.fromCharCode(10)+ch_str+String.fromCharCode(13)+String.fromCharCode(10);
ch_str='';
count=0;
}
else{
str+=cc.charAt(i);
ch_str+=cc.charAt(i);
count+=1;
}
}
make_braille(braille_array);
document.getElementById("txt6").value=str;//get_sound(cc);//
document.getElementById("txt6").innerText=str;//result;
}
//
function make_braille(arr)
{
// var arr=[39,25,10,39,38,2,40,49,32,52,9,0,56,11,32,34,15,10,54,27,10,37,35,32,28,35,10,0,24,32,52,61,10,44,63,10];
var left=100;
var top=20;
var colnum=0;
var rownum=0;
for (var i=0;i<arr.length;i++)
{ if(i>20)
{rownum=1;
colnum=i-20;}
else
{rownum=0;
colnum=i;}
print_a_character(left,top,colnum,rownum,arr[i]);
}
}
function print_a_character(left,top,colnum,rownum,num)
{
var res=num_to_array(num);
for(var i=0;i<res.length;i++)
{
for(var j=0;j<res[i].length;j++)
{
if(res[i][j]==1)
{drawCircleWithNative(left+1+j*10+colnum*24,top+1+i*10+rownum*34,4,4,0,360);}
else
{drawCircleWithNativeEmpty(left+1+j*10+colnum*24,top+1+i*10+rownum*34,4,4,0,360);}
}
}
}
//get_sound('声') ---->sheng1
/*function get_sound(character)
{
if(character=='声')
{return 'sheng1';}
else {return 'yin';}
}*/
// times2('a',2) --->'aa'
function times2(str, num){
return new Array(num+1).join(str);
}
function num_add(a,b)
{
return parseInt(a,10)+parseInt(b,10);
}
//find_code(first_sound_str,'b')---->40
function find_code(arr,str)
{ var result=0;
for(var i=0;i<arr.length;i++)
{
if(arr[i][1]==str)
{
result=array_to_num(arr[i][0]);
break;
}
}
return result;
}
//array_to_num([[1,0],[1,0],[0,0]]) --->40
function array_to_num(arr)
{ var result=0;
for(var i=0;i<arr.length;i++)
{
for(var j=0;j<arr[i].length;j++)
{result=result*2+arr[i][j];
}
}
return result;
}
//num_to_array(40)---->[[1,0],[1,0],[0,0]]
function num_to_array(num)
{ var temp=0;
var result=[[0,0],[0,0],[0,0]];
for(var i=result.length-1;i>=0;i--)
{
for(var j=result[i].length-1;j>=0;j--)
{
temp=num%2;
num=(num-temp)/2;
result[i][j]=temp;
}
}
return result;
}
function drawCircleWithNative(cx,cy,ra,rb,start,end)
{
cxt.fillStyle='black';
cxt.strokeStyle='pink';
cxt.lineWidth=1;
cxt.beginPath();
cxt.arc(cx,cy,ra,0,Math.PI*2);
cxt.closePath();
cxt.fill();
cxt.stroke();
}
function drawCircleWithNativeEmpty(cx,cy,ra,rb,start,end)
{
cxt.fillStyle='white';
cxt.strokeStyle='pink';
cxt.lineWidth=1;
cxt.beginPath();
cxt.arc(cx,cy,ra,0,Math.PI*2);
cxt.closePath();
cxt.fill();
cxt.stroke();
}
</script>
</BODY>
</HTML>