2015年4月22日 星期三

iOS BIG5 TO UTF8 OR UTF8 TO BIG5

最近需要用到傳big5 encoding給server.
但問題是,iOS的string是個UTF8Encoding, 所以要找個方法來把他轉換一下

之前做的都是把抓到的big5 encoding data 轉 NSUTF8Encoding,做法約:


    NSStringEncoding big5 = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5_HKSCS_1999);
    NSString *str = [[NSString alloc] initWithData:input encoding:big5];

如此就可以得到一個UTF8編碼的String



那要得到一個Big5編碼的String呢? 答案是:沒辦法

或許你會看到有人說這樣:

NSStringEncoding big5 = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5_HKSCS_1999);
    return [input stringByAddingPercentEscapesUsingEncoding:big5];

But... 這只有URL的時候才有效啊 ex :

www.google.com?q=test%2B%E4%B8%AD%E6%96%87

這時候URL會幫你自動翻成:

www.google.com?q=test+中文


但如果你要用POST呢? 那不能丟URL啦! 所以到底該怎麼辦?
通常傳送 Post Request都是用NSMutableURLRequest
他的HTTPBody是個NSData,因此只要確保NSData是Big5編碼就可以了

而要得到Big5編碼的NSData可以透過:

NSStringEncoding big5 = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5_HKSCS_1999);
    return [input dataUsingEncoding:big5 allowLossyConversion:false];


這樣就可以啦!

--------------------------------------------------------------------------------------------------------------------------

2015.10.13更新

使用Swift來進行編碼轉換


extension NSData {
    
   
    var big5String: String? {
        let big5 = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.Big5.rawValue))
        
        return NSString(data: self, encoding: big5) as? String;
        
    }
    
    
    
    
}

extension String {

    var big5Data: NSData? {
        let big5 = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.Big5.rawValue))
        return self.dataUsingEncoding(big5, allowLossyConversion: false);
    }

}


3 則留言:

  1. 請教一下 我使用這個方法卻出現錯誤訊息如下 Use of unresolved identifier 'kCFStringEncodingBig5'
    是否在swift裏頭無法使用呢?

    回覆刪除
    回覆
    1. 上面範例是Objective-C的程式碼, 可用Objective-C寫完之後再透過bridge import
      swift的轉碼以前我也沒找到,最近有找到辦法, 晚點再更新.

      刪除
  2. 作者已經移除這則留言。

    回覆刪除