VisualStudio 2022 アプリケーション リソース管理 中国語文字化け

Kota 20 評価のポイント
2025-03-04T04:40:19.56+00:00

Visual Studio 2022 バージョン 17.11 以降では、リソース エクスプローラーが変更され
Excelファイルにて、多言語用のリソースを管理し各言語別でコピー&ペーストを行っていました。

今回多言語も一括して確認できるようになり、ニュートラル値、ja-JP、en-US、zh-CNを一括で貼り付けを行うと、中国語(簡体)の文字のみ"?"表記で文字化けするようになりました。

1つ1つ修正するのは手間ですので、なにか回避する方法はありますでしょうか。

ユーザーの画像

Googleの日本語入力を使用してます。

Excel側では、中国語の列のみSimHeiフォントでコピー&ペーストしてみるなど行いましたが、"?"表記でした。

よろしくお願いいたします。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
128 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 11,456 評価のポイント MVP
    2025-03-04T10:42:06.78+00:00

    Excelからクリップボードにコピーが行われると、クリップボード内のCSV形式のデータにはSJISでバイナリ化された文字列が入ります。
    そのためSJISに無い文字は文字化けします。
    文字化けしないようにするにはコピーデータをUnicodeにする必要があります。

    回避方法はExcelの機能でコピーせずにVBAやVSTOでコピーを行うか、コピーされてしまったデータを修正しコピーしなおす必要があります。

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern int GetACP();
    
    const string DATAFORMAT_BIFF5 = "Biff5"; //エクセルからのコピー判定用        
    const string DATAFORMAT_RESOURCEEXPROW = "ResourceExplorerRows"; //Resoruceエクスプローラーからのコピー
    const string DATAFORMAT_CONVERTED = "CSV__CONVERTED"; //変換済み検出用
    
    private void Test1()
    {
        var codepage = GetACP();
        //if (codepage != 932)
        //{//SJISじゃないなら何もしない
        //    return;
        //}
    
        var dOrg = Clipboard.GetDataObject();
        if (dOrg != null
            && dOrg.GetDataPresent(DataFormats.CommaSeparatedValue)
            && dOrg.GetDataPresent(DataFormats.UnicodeText)
            && dOrg.GetDataPresent(DATAFORMAT_BIFF5)
            && !dOrg.GetDataPresent(DATAFORMAT_RESOURCEEXPROW)
            && !dOrg.GetDataPresent(DATAFORMAT_CONVERTED))
        {
            var oCSV = dOrg.GetData(DataFormats.CommaSeparatedValue);
    
            if (dOrg.GetData(DataFormats.UnicodeText) is string unitext
                && oCSV is System.IO.MemoryStream ms) //Excelからはストリーム形式でCSV格納
            {
    
                //.NetCoreの場合はSJISを取れないのでNugetでSystem.Text.Encoding.CodePagesを入れておく
                //System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    
                //クリップボードのCSVがSJISでエンコードされているので変換
                var osEncoding = System.Text.Encoding.GetEncoding(codepage);
    
                string csvOriginal = osEncoding.GetString(ms.ToArray());
                string csvNew = csvOriginal;
    
                //if (csvOriginal.Contains("?")) //System.Diagnostics.Debug.WriteLine("文字化けの可能性");
                {
                    while (unitext.EndsWith("\r\n"))
                    {
                        unitext = unitext.Substring(0, unitext.Length - 2);
                    }
    
                    // 文字列から変換しなおす
                    // 文字列はTSVになってるので、てきとうにCSV文字列化
                    //(セル内にタブがある場合は非対応)
                    csvNew = string.Join(",", unitext.Split("\t").Select(_ => "\"" + _.Replace("\"", "\"\"") + "\""));
                }
    
                DataObject dNew = new DataObject();
                dNew.SetData(DataFormats.Text, unitext);
                dNew.SetData(DataFormats.UnicodeText, unitext);
    
                dNew.SetData(DataFormats.CommaSeparatedValue, csvNew);
    
                dNew.SetData(DATAFORMAT_CONVERTED, ms);//変換済みのデータとしてマーク
    
                Clipboard.SetDataObject(dNew); //変換済みをクリップボードに
            }
        }
    }
    

    20250314: Repalceの文字が間違ってたのを修正(\\ -> \")

    1 人がこの回答が役に立ったと思いました。

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Dou Xu-MSFT 480 評価のポイント Microsoft 外部スタッフ
    2025-03-04T08:47:01.85+00:00

    こんにちは @Kota,

    Microsoft Q&A フォーラムへようこそ。

    使用している Visual Studio のバージョンを確認できますか?

    他のコミュニティで報告された中国語の文字化けに関する同様の問題がありましたが、修正されました。

    入力メソッドで中国語の文字を入力すると、文字化けします

    最新バージョン 17.13.2 に更新して、問題が解決するかどうかを確認してください。[ヘルプ] -> [更新プログラムの確認] に移動します。

    よろしくお願いいたします。

    Dou


    回答が役に立った場合は、「回答を受け入れる」をクリックして、投票してください。注意:このスレッドに関連するメール通知を受け取りたい場合は、ドキュメントの手順に従って、メール通知を有効にしてください。

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。