最近做的一個項目中有用到二維碼掃描, 但在測試過程中發現用 GBK編碼帶中文的數據生成二維碼后, 掃描不來的結果是一段亂碼, 對於這種情況一般有以下兩種解決方案;
- 讓后台更改生成二維碼的編碼, 不要用 GBK 進行編碼, 但這種方式存在局限性, 只適用於掃描后台給出的特定二維碼, 但在大多數的時候, 我們無法知曉自己掃描的二維碼是以何種格式進行編碼的, 所以在這個時候就需要我們客戶端在對掃描的結果進行處理.
- 對掃描的結果進行處理, 下面的一點段代碼我在 iOS 中對這種 GBK 編碼的而導致掃描不出結果的字符串進行的處理, 原理是: NSString 一開始把一段 GBK 編碼的字節流逐個字節地按照 8bit處理了,原本 8 個字節對應的是 5 個字符,結果被錯誤地解碼為了 8 個字符,所以我們要把它轉換回去,首先是要還原回原來的那段字節流, 然后再將這段字節流按照正確的編碼 (GB18030) 處理:
//scanResultStr為掃描結果
NSData *data=[scanResultStr dataUsingEncoding:NSUTF8StringEncoding];
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *dealwithStr = [[NSString alloc] initWithData:data encoding:enc];
//如果掃描中文亂碼則需要處理,否則不處理
if (dealwithStr){
NSInteger max = [scanResultStr length];
char *nbytes = malloc(max + 1);
for (i = 0; i < max; i++){
unichar ch = [scanResultStr characterAtIndex: i];
nbytes[i] = (char) ch;
}
nbytes[max] = '\0';
result=[NSString stringWithCString: nbytes encoding: enc];
}