75343


### やりたいこととできないこと

現在、utf-8をsjisに変換したいです。[このサイト](https://qiita.com/tgk1/items/b333486238d5f7641b36)を参考にして、sjisに変換しようとしました。  
またswiftの文字コードを判定するやり方が分からなかったので、それに関しては[こちらのサイト](https://uic.jp/encode-
detector/)でsjisになっているか確認しました。  
しかし、結果はutf-8のままでした。

**環境:**  
playground  
xcode12

### コード

[code]

    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
        }
    }
    
    let postStrChaRef: String = "あいうえお".characterReferenceSJIS() // 文字参照変換
    print(postStrChaRef) // あいうえお
    
[/code]

結果を[判定サイト](https://uic.jp/encode-detector/)に入力したところ以下のようにutf-8になってしまいます。

[![画像の説明をここに入力](https://i.stack.imgur.com/1Tiag.png)](https://i.stack.imgur.com/1Tiag.png)

### 何を・どのように調べたのか

上記を解決するために、以下のキーワードで検索しました。

・swift utf8 sjis 文字変換  
・swift convert utf8 to sjis

参考にした記事のURLは以下です。

・[swift
UTF8からSJISに変換するときに、数値文字参照も使用する](https://qiita.com/tgk1/items/b333486238d5f7641b36)

### 何が原因だと思うか

申し訳ありませんが、文字コードの知見があまりなくネット上のサンプルを使いまわすことしかできず検討がつきません。

### そもそも文字コードをsjisに変換しないといけない理由

外部APIのリクエスト値をsjisにしないと正常なレスポンスを取得することができないからです。

この問題に関して何かあれば、アドバイスよろしくお願いします。


CC BY-SA 4.0
2021-04-17T10:07:25.230
75342
2021-04-19T04:11:26.120
2021-04-19T04:11:26.120
3060
36424
question
swift
swiftで文字コードをutf-8からsjis(Shift-JIS)に変換したい。


そのやり方では、文字列をクリップボードにコピーしてペーストした時にutf8文字列として、コピー＆ペーストされているでしょう。

`playgroud`ではユーザーディレクトリーへのアクセス権がないのでこんな`playground`で動くコードを作ってみました。

[code]

    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)
    }
    
[/code]

実行し、ファイルへの描き込みが成功すると作成されたファイルへのパスが`playground`に表示されますので、これをコピーし、ファインダーで、コマンド＋シフト＋Gキーを押して出る窓にそれをペーストし、リターンキーを押します。

すると、`test.txt`というファイルが一つあるフォルダーの窓が開くはずです。  
試しにこれを`BBEdit`で開くと

> Ç†Ç¢Ç§Ç¶Ç®

と、表示されます。エンコードを指定して再度開くで、ShiftJISを指定して開き直すと

> あいうえお

と表示されるのでShift-JISへのエンコードが成功していることが解ります。

なので、`str1.data(using: .siftJIS.....)したdataをそのまま`api`に返してあげれば良いのです。

更に言うと文字化けを心配されているようですが、文字化けするようなutf8文字列は文字化けしようがしまいが`api`を誤動作させかねないので事前に弾く仕組みを撞けるべきだと思います。


CC BY-SA 4.0
2021-04-17T11:01:57.790
75343
2021-04-17T11:29:50.200
2021-04-17T11:29:50.200
14745
14745
75342
answer