Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 11144|Απάντηση: 2

Σχετικά με το πρόβλημα των κινεζικών αλλοιωμένων χαρακτήρων κατά τη χρήση του ZXing για τη σάρωση κωδικών QR

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 8/3/2015 11:36:08 μ.μ. | | |
Η λειτουργία του πρόσφατου έργου απαιτεί τη χρήση σάρωσης κωδικών QR. Αναφέρομαι στο έργο ανοιχτού κώδικα ZXing της Google: Αφού ολοκληρωθεί η λειτουργία: Διαπίστωσα ότι δεν υπήρχε πρόβλημα στη σάρωση του γραμμωτού κώδικα: Αλλά κατά τη σάρωση του κωδικού 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.         }
Αντιγραφή κώδικα


Τρίτον: Το παρακάτω είναι να κρίνουμε αν είναι σε κωδικοποίηση Unicode


  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 Website Guard στη βελτιστοποίηση ιστοτόπων;
Δημοσιεύτηκε στις 4/9/2015 1:20:39 μ.μ. |
Είναι τόσο δυνατό
Δημοσιεύτηκε στις 4/9/2015 3:04:46 μ.μ. |
lele52099 δημοσιεύτηκε στις 2015-9-4 13:20
Είναι τόσο δυνατό

Γιατί έχετε αυτή την έκφραση;
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com