Created
December 18, 2019 04:51
-
-
Save WorldDownTown/0343b4f31be1117abb2e2213b707c99c to your computer and use it in GitHub Desktop.
Kanji to hiragana or katakana
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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