問題 文字コード変換だけでは望ましい結果にならない
具体的にはしたらば掲示板(EUC-JP)や旧2ちゃんねる互換掲示板(ShiftJIS)を想定しています。
ShiftJISのウェブサーバにPOSTしたいのですが、変換できない文字があると
String.data(using: .shiftJIS)だと失敗します。
String.data(using: .shiftJIS, allowLossyConversion: true)
を使うと失敗はしませんが変換できなかった部分が**?**になって「何これ?」ってなります。
解決方法
- 1文字ごとにShiftJIS(EUC-JP)に変換できるか確認する
- 変換できない場合にはhtmlの文字参照に起きかえる
- ShiftJIS(EUC-JP)変換を行なう
というステップを取ります。
var postStr: String = "(´・ω・`)"
let postStrChaRef: String = postStr.characterReferenceSJIS() // 文字参照変換
let postData:Data? = postStrChaRef.data(using: .shiftJIS) // SJIS変換
import Foundation
extension String {
func characterReferenceSJIS() -> String {
var buf = ""
for c in self.map({ String($0) }) {
if c.canBeConverted(to: String.Encoding.shiftJIS) {
buf.append(c)
} else {
let buf1 = NSMutableString(string: c)
CFStringTransform(buf1, nil, kCFStringTransformToXMLHex, false)
buf.append(buf1 as String)
}
}
return buf
}
}