Skip to content

Instantly share code, notes, and snippets.

@WorldDownTown
Created December 18, 2019 04:51
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save WorldDownTown/0343b4f31be1117abb2e2213b707c99c to your computer and use it in GitHub Desktop.
Save WorldDownTown/0343b4f31be1117abb2e2213b707c99c to your computer and use it in GitHub Desktop.
Kanji to hiragana or katakana
import Foundation
private extension CFStringTokenizer {
var hiragana: String { string(to: kCFStringTransformLatinHiragana) }
var katakana: String { string(to: kCFStringTransformLatinKatakana) }
private func string(to transform: CFString) -> String {
var output: String = ""
while !CFStringTokenizerAdvanceToNextToken(self).isEmpty {
output.append(letter(to: transform))
}
return output
}
private func letter(to transform: CFString) -> String {
let mutableString: NSMutableString =
CFStringTokenizerCopyCurrentTokenAttribute(self, kCFStringTokenizerAttributeLatinTranscription)
.flatMap { $0 as? NSString }
.map { $0.mutableCopy() }
.flatMap { $0 as? NSMutableString } ?? NSMutableString()
CFStringTransform(mutableString, nil, transform, false)
return mutableString as String
}
}
enum Kana { case hiragana, katakana }
func convert(_ input: String, to kana: Kana) -> String {
let trimmed: String = input.trimmingCharacters(in: .whitespacesAndNewlines)
let tokenizer: CFStringTokenizer =
CFStringTokenizerCreate(kCFAllocatorDefault,
trimmed as CFString,
CFRangeMake(0, trimmed.utf16.count),
kCFStringTokenizerUnitWordBoundary,
Locale(identifier: "ja") as CFLocale)
switch kana {
case .hiragana: return tokenizer.hiragana
case .katakana: return tokenizer.katakana
}
}
extension String {
var hiragana: String { convert(self, to: .hiragana) }
var katakana: String { convert(self, to: .katakana) }
}
let names: [String] = ["相葉雅紀", "松本潤", "二宮和也", "大野智", "櫻井翔"]
for name in names {
print("\(name.katakana) / \(name.hiragana)")
}
// アイバマサキ / あいばまさき
// マツモトジュン / まつもとじゅん
// ニノミヤカズヤ / にのみやかずや
// オオノサトシ / おおのさとし
// サクライショウ / さくらいしょう
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment