次の方法で共有

DataGridViewに配置したTextBoxColumnにUTF-8の4バイト文字を入力したところ、MaxInputLengthで指定した文字数まで入力できない

Takeda, Shinji/武田 真司 0 評価のポイント
2025-07-09T11:22:03.5+00:00

ご担当者様

私共では以前にC++言語で開発したWindows Formアプリケーションの改修作業を行っており、入出力可能な文字をUTF-8に対応しようとしております。

その際に、以下の現象に遭遇しました。

解決法など、ご教示ください。

現象:

・DataGridViewに配置したTextBoxColumnにUTF-8の4バイト文字を入力したところ、MaxInputLengthで指定した文字数まで入力できない

確認内容:

・UTF-8の1バイト文字のみを入力すると、MaxInputLengthで指定した文字数まで入力できる

・UTF-8の3バイト文字のみを入力すると、MaxInputLengthで指定した文字数まで入力できる

・UTF-8の4バイト文字のみを入力すると、MaxInputLengthで指定した文字数の半数しか入力できない

使用した文字:

・UTF-8の1バイト文字:1234567890

・UTF-8の3バイト文字:1234567890

・UTF-8の4バイト文字:𢿐𢿑𢿒𢿓𢿔𢿕𢿖𢿗𢿘𢿙

期待する動作:

・全てのUTF-8の文字で、MaxInputLengthで指定した文字数まで入力できるようになる

開発環境:

・Visual Studio 2022 C++

・Windows 11 Pro 23H2

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

Windows での開発 | インターネット インフォメーション サービス
0 件のコメント コメントはありません

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 14,146 評価のポイント MVP ボランティア モデレーター
    2025-07-09T11:45:09.95+00:00

    もともとはUTF-16の2バイトで1文字としていたのに、UTF-16に収まらないサロゲートやら異字体セレクタや絵文字修飾子やらZWJやらで文字数の数え方が変わってしまうんです。

    例えば以下の例は見た目1文字として扱えるんですよ。(フォントが対応していれば)

    // 肌色違い4人家族
    CString string = L"\U0001F469\U0001F3FB" L"\u200D" L"\U0001F468\U0001F3FC" L"\u200D" L"\U0001F467\U0001F3FD" L"\u200D" L"\U0001F476\U0001F3FE";
    

    セルの入力につかわれるTextBoxには文字数制限をせずに、入力中にICUライブラリで文字数を数えて長すぎたら確定できないように警告表示、確定されそうになったらCellValidatingイベントでキャンセルをするぐらいしかできないでしょうね。

    # UTF-8の1文字が今後どこまで大きくなるかわからないという

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "おすすめ" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。