a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 172|回复: 0

[专业语言] 在JAVA开发中的中文处理问题及解决方法

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
应用开发的过程中,总会遇到一些“难以理解”的系统缺陷和“不易解决”的问题。其实,通过认真分析,不必购买昂贵的产品依然可以解决多数问题。 , Y6 i) m" D3 A' i# I3 ~' K

0 s$ B( J1 ^/ n# x/ K9 U  T  ■JDBC ODBC Bridge的Bug及其解决方法 ( Y: @5 ^* H  f* j# |. z
  在编写一数据库管理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,如果为英文字符,存储内容完全正确,如果存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge还存在无法建表的Bug)。
# A# w. K9 G/ I0 {0 L# e( z
' Y# y* q! h; i$ ]  对于广大需要存储中文信息的Java程序员来说,这可是一个不好的消息。要么改用其他语言编程,要么选择其他价格昂贵的数据库产品。“一次编写,到处运行”的目标,也大打折扣。能不能采用变通的方法,将中文信息进行处理后再存储来解决这个问题呢?答案是肯定的。 5 k* t  w3 c' H3 d: o1 l' B+ m5 I

3 L$ d) A2 a$ K3 h  解决问题的具体思路、方法 ! S8 p+ P0 o! Z+ H- L1 X: s  X
  Java采用Unicode码编码方式,中英文字符均采用16bit存储。既然存储英文信息是正确的,根据一定规则,将中文信息转换成英文信息后存储,自然不会出现截尾现象。读取信息时再进行逆向操作,将英文信息还原成中文信息即可。由GB2312编码规则可知,汉字一般为二个高位为1的ASCII码,在转换时将一个汉字的二个高位1去掉,还原时再将二个高位1加上。为了处理含有英文字符的中文字串,对英文字符则需要加上一个Byte 0标记。以下提供的两个公用静态方法,可加入任何一个类中使用。
, I7 d8 v6 `4 r+ p$ I) B6 l6 F$ M/ F& H
  将中英文字串转换成纯英文字串 2 j8 v) c8 D7 T% a$ e$ b" r
  public static String toTureAsciiStr(String str){ 5 K- q0 O4 p5 R  c: Y
7 l6 R& G% [$ G
  StringBuffer sb = new StringBuffer();   n* {$ s. T% i' }
4 k0 I* E! x+ X& y/ a& F7 Y4 Q% N
  byte[] bt = str.getBytes();
: C1 y0 O" A: X, g' i$ N
: }$ ~& N9 h. ]0 ]  for(int i =0 ;i〈bt.length;i++){
/ j: f, h0 S7 Z8 g) {0 N; q; H) Z4 ~+ G* X8 l+ V( Y
  if(bt〈0){ 5 o5 n5 C  X+ A* [* j: J* u
+ ^6 J  K3 W+ V
  //是汉字去高位1 % m# _! G; }. ~2 ~- V- z
. s$ Y  A1 S$ F" r
  sb.append((char)(bt&&0x7f));
7 c3 U' m& ~+ k! X9 f6 x# l% {$ ]: y' n% \0 @% O
   }else{//是英文字符 补0作记录
# S+ ]  }) t/ c1 |% m/ j! l4 U$ Y) e/ M; I- ~& ^; C
  sb.append((char)0); * J  s4 w  S* r$ s
9 S. g# P. v! s0 `6 ^
  sb.append((char)bt); # G4 ]9 }/ r+ ?& l; c$ a( I
) n7 s3 E3 S3 i8 R0 ]9 Z3 L" w+ I
   } - T! ~  |' ?; F. u

3 {- v9 \( o( I5 ^8 U9 y1 [3 e9 s   } * Y. k7 p0 h( k" s0 o/ X7 Z
: u7 L3 J5 L" h& ^" {* r7 K0 U4 |
  return sb.toString();
7 Q2 ?/ t, G$ ^% ^4 A6 U
2 r& e4 d2 @7 O6 ?# v5 e3 E0 l  }
4 T1 x3 q6 F+ `3 U  c7 B$ T
5 ]9 j3 b4 d: t3 t5 O  S3 A8 `2 w  将经转换的字串还原 7 W$ E1 Y9 ^; F' u- g
  public static String unToTrueAsciiStr(String str){ ! d7 h7 Y; O: Z9 W
6 ~, N7 M) [! F9 z) c! k
   byte[] bt = str.getBytes();
1 e$ W7 V5 |4 e+ t2 `7 b$ m4 S- d, I, Q5 r, B) E
   int i,l=0,length = bt.length,j=0; # I' n. t7 K% t9 Y, M
! O1 I; C) @" r# L! S
   for(i = 0;i〈length;i++){ ) i! q5 W: I  P- q. B, J7 m3 y, u
: i# h9 Z8 R! I, i! _
   if(bt == 0){
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 18:00 , Processed in 0.316953 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表