이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 11144|회답: 2

ZXing을 사용해 QR 코드를 스캔할 때 발생하는 중국어 문자 왜곡 문제에 대하여

[링크 복사]
게시됨 2015. 3. 8. 오후 11:36:08 | | |
최근 프로젝트의 기능은 스캔 QR 코드를 사용하는 것입니다. 저는 구글의 오픈 소스 프로젝트 ZXing을 언급합니다: 기능이 완료된 후: 바코드를 스캔하는 데 문제가 없다는 것을 알게 되었습니다: 하지만 QR 코드를 스캔하면 일부는 뒤섞여 있습니다: 아니면 중국인의 질문이 아닌가: 인터넷에서 많은 정보를 참고했습니다. 하지만 그 효과는 여전히 이상적이지 않습니다: 나중에 ISO-8859-1 형식으로 인코딩된 한 결과는 제거된 후 그에 맞게 변환된다는 사실이 밝혀졌습니다: 문제는 해결되었습니다. 소스 코드를 수정할 필요는 없습니다: 방법은 다음과 같습니다

첫째: 먼저 CaptureActivity 클래스에서 기본 인코딩을 설정하세요


  1. decodeFormats = null;
  2. characterSet = "ISO-8859-1";
코드 복사


둘째: 결과를 가져오는 활동에서 해당 인코딩을 변환합니다. 여기 ResultActivity 클래스에서 작업 중입니다


  1. public class ResultActivity extends Activity implements OnClickListener{

  2.         private TextView dec_result;
  3.         private String resultStr;
  4.         private ImageView codeImage;
  5.         private Button returnChoujiang,returnJubao;
  6.         @Override
  7.         protected void onCreate(Bundle savedInstanceState) {
  8.                 // TODO Auto-generated method stub
  9.                 super.onCreate(savedInstanceState);
  10.                 setContentView(R.layout.dec_result);
  11.                 init();
  12.                 dec_result=(TextView)findViewById(R.id.dec_result);
  13.                 codeImage=(ImageView)findViewById(R.id.code_image);
  14.                 Intent intent=getIntent();
  15.                 resultStr=intent.getStringExtra("result");
  16.                 String UTF_Str="";
  17.                 String GB_Str="";
  18.                 boolean is_cN=false;
  19.                 try {
  20.                         System.out.println("------------"+resultStr);
  21.                         UTF_Str=new String(resultStr.getBytes("ISO-8859-1"),"UTF-8");
  22.                         System.out.println("这是转了UTF-8的"+UTF_Str);
  23.                         is_cN=IsChineseOrNot.isChineseCharacter(UTF_Str);
  24.                         //防止有人特意使用乱码来生成二维码来判断的情况
  25.                         boolean b=IsChineseOrNot.isSpecialCharacter(resultStr);
  26.                         if(b){
  27.                                 is_cN=true;
  28.                         }
  29.                         System.out.println("是为:"+is_cN);
  30.                         if(!is_cN){
  31.                                 GB_Str=new String(resultStr.getBytes("ISO-8859-1"),"GB2312");
  32.                                 System.out.println("这是转了GB2312的"+GB_Str);
  33.                         }
  34.                 } catch (UnsupportedEncodingException e) {
  35.                         // TODO Auto-generated catch block
  36.                         e.printStackTrace();
  37.                 }
  38.                
  39.                
  40.                 Bitmap bm=intent.getParcelableExtra("IMG_return");
  41.                 if(is_cN){
  42.                         dec_result.setText(UTF_Str);
  43.                 }else{
  44.                         dec_result.setText(GB_Str);
  45.                 }
  46.                 codeImage.setImageBitmap(bm);
  47.                
  48.                 returnChoujiang.setOnClickListener(this);
  49.                 returnJubao.setOnClickListener(this);
  50.         }
코드 복사


셋째: 다음은 유니코드 인코딩 여부 판단을 위한 것입니다


  1. public class IsChineseOrNot {
  2.        
  3.     public static final boolean isChineseCharacter(String chineseStr) {  
  4.         char[] charArray = chineseStr.toCharArray();  
  5.         for (int i = 0; i < charArray.length; i++) {         
  6.                 //是否是Unicode编码,除了"&#65533;"这个字符.这个字符要另外处理
  7.             if ((charArray[i] >= '\u0000' && charArray[i] < '\uFFFD')||((charArray[i] > '\uFFFD' && charArray[i] < '\uFFFF'))) {  
  8.                 continue;
  9.             }
  10.             else{
  11.                     return false;
  12.             }
  13.         }  
  14.         return true;  
  15.     }  
  16.    
  17.     public static final boolean isSpecialCharacter(String str){
  18.             //是"&#65533;"这个特殊字符的乱码情况
  19.             if(str.contains("&#239;&#191;&#189;")){
  20.                     return true;
  21.             }
  22.             return false;
  23.     }
  24. }
코드 복사


마지막으로, 이는 ZXing의 중국어 혼란 문제를 해결합니다




이전의:PHP가 QR 코드 예제를 생성합니다
다음:360 웹사이트 가드가 웹사이트 최적화에 미치는 영향은 무엇인가요?
게시됨 2015. 9. 4. 오후 1:20:39 |
정말 강력해요
게시됨 2015. 9. 4. 오후 3:04:46 |
lele52099, 2015-9-4 13:20에 게시됨
정말 강력해요

왜 그런 표정을 짓고 있어?
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com