🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

1949閲覧

【iOS C#】Shift-JIS文字列を文字化けさせずにUIImageへと描画したい

JpTomari

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/01/12 09:13

編集2021/01/12 13:15

前提

Shift-JIS文字列を、UIImageで生成した画像に表示しようと考えております。

現在以下のソースで描画を試みましたが、文字化けが発生してしまい、正しい表示となりません。

ソースコード

C#

1 // 保存先の参照を定義 2 UIImage image = null; 3 4 // 描画先となるウィンドウイメージを生成 5 CGSize windowSize = new CGSize(tw, th); 6 UIGraphics.BeginImageContextWithOptions(windowSize, false, 0); 7 8 // Contextの取得 9 CGContext context = UIGraphics.GetCurrentContext(); 10 11 // フォントの設定 12 UIFont font = UIFont.SystemFontOfSize((int)fontSize); 13 14 // 文字列の取得 15 // ※ここでどうするか? 16 NSString text = new NSString(str); 17 18 // イメージの透過色クリア 19 RectangleF rectF = new RectangleF(0, 0, tw, th); 20 context.SetFillColor(UIColor.Clear.CGColor); 21 context.FillRect(rectF); 22 23 // 描画座標Rectangleの生成 24 CGSize size = text.StringSize(font); 25 int half = (int)(((ih - (size.Height * mNativeScale)) / 2) * mScreenScale); 26 RectangleF textRect = new RectangleF(0, Math.Max(half, 0), iw, ih); 27 28 // 文字列の描画 29 context.SetFillColor(UIColor.Black.CGColor); 30 text.DrawString(textRect, font, UILineBreakMode.WordWrap, UITextAlignment.Left); 31 32 // イメージの取得 33 image = UIGraphics.GetImageFromCurrentImageContext(); 34 UIGraphics.EndImageContext();

やりたいこと

与えられたShift-JIS文字列である"str"を、UIImage上に正しく表示したいと考えております。
なお、ソースとなるShift-JIS文字列を、異なる文字コードで準備するのは現実的ではないとお考え下さい。

上記ソースの"※"の箇所を若干変更することで何とかなると考えているのですが、方策が見つかりません。
一旦NSData変数へ変換して…ということもやろうとしたのですが、良いC#ソースのサンプルが見つからず困っております。

何かいい手段はございませんでしょうか?
以上、どうぞよろしくお願いいたします。

追記

文字列の生成について追記いたします。

C#

1 int idx = 0; 2 String line; 3 4 // StreamReaderを開く 5 // ※外部リソースファイルからの読み込み 6 StreamReader reader = new StreamReader("bin_data/stage_data/stage_title"); 7 8 try 9 { 10 // 文字列保存テーブルの生成 11 mStageTitle = new string[100]; 12 13 // 読み込みループ 14 // ※最低でも1ラインは存在する 15 do 16 { 17 // 1ライン読み込み 18 line = reader.ReadLine(); 19 20 // 文章が存在しないならば終了 21 if (line == null) break; 22 23 // 空白行なら読み飛ばす 24 if (line.Length == 0) continue; 25 26 // 文字列をテーブルに保存 27 mStageTitle[idx++] = line; 28 } 29 while (true); 30 31 // StreamReaderを閉じる 32 reader.Close(); 33 } 34 catch (Exception e) 35 { 36 // catch節は省略 37 } 38

以上の処理で、外部ファイルから複数行の文字列を取得します。
先の出力処理におけるString変数"str"は、このmStageTitleテーブルから取得される1行の文字列となります。
(テーブルの添え字を使って、直接持ってくるだけです。)

外部ファイルはShift-JISによるテキストファイルとなり、その変更は互換性の関係から不可とされています。

以上、他に何か不足などございましたら、ご指摘お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2021/01/12 12:26

そのあなたのいう「Shift-JIS文字列」なるものを生成する部分のコードを書いてください。
guest

回答1

0

ベストアンサー

StreamReaderの引数に適切なEncodingを渡してください。
参考: 文字コードを指定してテキストファイルを読み込む

投稿2021/01/12 13:22

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JpTomari

2021/01/12 14:04

ご回答、ありがとうございます。 文字列の描画ではなく、入力の側に問題がある事まで考えが至りませんでした。 おかげで無事作業を進められます。 重ね重ね、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問