Posted at

Swiftで色々なテキストエンコーディングのテキストを読む

More than 3 years have passed since last update.

このドキュメントの後半に書いたライブラリの実装中に、「NS...」以外のテキストエンコーディングを使う処理をSwiftで書いたのですが、引数に指定する定数が、Objective-Cのときの値そのままではなく、少し分かりにくかったのでまとめました。


概要

Swiftでテキストエンコーディングとテキストデータを指定して、文字列を読み込むには、次のように「NSString」クラスを使うのが楽です。

let text = NSString(data: textData, encoding: NSUTF8StringEncoding)

UTF-8以外のテキストの場合は、引数「encoding」の値を変更します。指定可能な値は「NSMacOSRomanStringEncoding」などいくつか定義されています。詳しくはリファレンスを参照してください。


「NS...」以外のテキストエンコーディングを指定したいとき

「CFString」用には、「NS...」では定義されていないもっと沢山のテキストエンコーディングが定義されています。これらを使いたいときは、次の関数を使います。

func CFStringConvertEncodingToNSStringEncoding(_ encoding: CFStringEncoding) -> UInt

この関数の引数に渡す値ですが、次の2つのenumに定義されています。

* CFStringBuiltInEncodings

* CFStringEncodings

「CFStringBuiltInEncodings」に定義されている値は、次のように単純に「rawValue」を指定すればOKです。

let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringBuiltInEncodings.UTF16LE.rawValue)

「CFStringEncodings」に定義されている方は、「CFStringEncoding」になるように、一工夫します。具体的には次のような感じです。

let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.DOSJapanese.rawValue))


テキストからテキストエンコーディングを認識したい

テキストデータからテキストエンコーディングを認識したいときは、自分でどうにかする他ないと思います。(知らないだけであるのかも)

XMLやHTMLなら、メタデータに書かれている情報を使うという方法もあります。その他には、テキストデータに出てくるパターンから認識させるという方法もあります。これは、私が書いているライブラリの中で実装しています。

日本語のテキストエンコーディングとUTF系に限定していて、完璧では無いですが、大体のテキストを認識出来ています。興味がある方はご覧ください。いくつか上手く認識出来ない文字パターンがあります。

MTCCore

https://github.com/akirark/MTCCore

「TextEncoding」クラスの「detectTextEncodingOfTextBuffer」メソッドで実装しています。

公開しているフリーウェアのコア部分をSwiftで、ごく最近書き直したものです。