質問: "あいうえお".characterReferenceSJIS() // 文字参照変換 print(postStrChaRef) // あいうえお ``` 結果を判定サイトに入力したところ以下のようにutf-8になってしまいます。 ![画像の説明をここに入力](https://i.stack.imgur.com/1Tiag.png) ### 何を・どのように調べたのか 上記を解決するために、以下のキーワードで検索しました。 ・swift utf8 sjis 文字変換 ・swift convert utf8 to sjis 参考にした記事のURLは以下です。 ・swift UTF8からSJISに変換するときに、数値文字参照も使用する ### 何が原因だと思うか 申し訳ありませんが、文字コードの知見があまりなくネット上のサンプルを使いまわすことしかできず検討がつきません。 ### そもそも文字コードをsjisに変換しないといけない理由 外部APIのリクエスト値をsjisにしないと正常なレスポンスを取得することができないからです。 この問題に関して何かあれば、アドバイスよろしくお願いします。
回答: そのやり方では、文字列をクリップボードにコピーしてペーストした時にutf8文字列として、コピー&ペーストされているでしょう。 `playgroud`ではユーザーディレクトリーへのアクセス権がないのでこんな`playground`で動くコードを作ってみました。 ``` import Foundation let str1: String = "あいうえお" let data: Data = str1.data(using: String.Encoding.shiftJIS, allowLossyConversion: true)! do { let directoryWrite: URL = URL(string: "file://" + NSHomeDirectory() + "/")! try data.write(to: directoryWrite.appendingPathComponent("test").appendingPathExtension("txt")) print(directoryWrite) } catch let error { print(error.localizedDescription) } ``` 実行し、ファイルへの描き込みが成功すると作成されたファイルへのパスが`playground`に表示されますので、これをコピーし、ファインダーで、コマンド+シフト+Gキーを押して出る窓にそれをペーストし、リターンキーを押します。 すると、`test.txt`というファイルが一つあるフォルダーの窓が開くはずです。 試しにこれを`BBEdit`で開くと > > Ç†Ç¢Ç§Ç¶Ç® > > > と、表示されます。エンコードを指定して再度開くで、ShiftJISを指定して開き直すと > > あいうえお > > > と表示されるのでShift-JISへのエンコードが成功していることが解ります。 なので、`str1.data(using: .siftJIS.....)したdataをそのまま`api`に返してあげれば良いのです。 更に言うと文字化けを心配されているようですが、文字化けするようなutf8文字列は文字化けしようがしまいが`api`を誤動作させかねないので事前に弾く仕組みを撞けるべきだと思います。