あるバッファに入っている文字列の文字コード(ANSI、SJIS、UNICODEなど)を判定したいのですが、色々と調べたのですが、解決しませんでした。
ANSIでもUNICODEでもきちんと文字列を扱えるアプリケーションを開発しています、問題となる例です↓
(メッセージボックス)
int MessageBox_OK( HWND hWnd, LPCTSTR lpCaption, LPCTSTR lpText )
{
int ret;
int len_w;
LPWSTR wCaption, wText; //変換後の、UNICODE文字列取得バッファ
//コンパイル設定がUNICODEの時に、ANSIをUNICODEに変換する
#ifdef UNICODE
//ここで文字コードを判定したいです|・ω・`)
//UNICODEでなかったらUNICODEに変換する
len_w = AnsiToUnicode_Size( lpCaption );
len_w = len_w * sizeof(WCHAR);
wCaption = (LPWSTR)malloc( len_w + 1 );
AnsiToUnicode_Convert( lpCaption, wCaption );
//ここで文字コードを判定したいです|・ω・`)
len_w = AnsiToUnicode_Size( lpText );
len_w = len_w * sizeof(WCHAR);
wText = (LPWSTR)malloc( len_w + 1 );
AnsiToUnicode_Convert( lpText, wText );
#else
return MessageBox( hWnd, lpText, lpCaption, MB_OK );
#endif
return MessageBox( hWnd, wText, wCaption, MB_OK );
}
//ANSI→UNICODE (必要サイズ(文字数))
int AnsiToUnicode_Size( LPCSTR strAnsi );
//ANSI→UNICODE (変換)
BOOL AnsiToUnicode_Convert( LPCSTR strAnsi, LPWSTR strUnicode );
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
★IsTextUnicode() 関数を見つけました。
・バッファに Unicode 文字の形式が含まれている可能性が高いかどうか判定します。
これをそのまま使えば IsUnicode() を自作しなくても良さそうですよ。
DWORD IsTextUnicode(
CONST LPVOID lpBuffer, // 調査対象の入力バッファへのポインタ
int cb, // 入力バッファのサイズ(バイト数)
LPINT lpi // 実施するテストを指定し、個々のテスト結果を受け取る整数へのポインタ
);
と MSDN マニュアルには載っています。
・使い方は下のサンプルのようになります。
サンプル:
BOOL IsUnicode( LPCTSTR str )
{
INT iRet = IS_TEXT_UNICODE_STATISTICS;
return (BOOL)IsTextUnicode( (LPCVOID)str, lstrlenA((LPCSTR)str), &iRet );
}
その他:
・統計的に調査するようなので確実に Unicode 文字列とは判断されないようです。
短い文字列では全滅でした。次のリンクにテストしたサンプルが載っています。
http://www.hey-to.net/ML-archive/vcppML/1999/msg …→『UNICODEテキストとシフトJISテキストの区別』
・SJIS文字、Unicode文字の判定はかなり難しいようです。
ネットで『IsTextUnicode』キーワードで検索すると多数見つかります。
全部は見ていないため一度すべてのページに目を通しておきましょう。
・以上。下の『参考URL』もどうぞ。
参考URL:http://msdn.microsoft.com/library/ja/default.asp …
No.2
- 回答日時:
はずしていたらごめんなさい、ですが、
単純にユニコードにしたいだけなら、TCHAR型を使うのではだめですか。
長々とコーディングしなくても、同じ内容が、2~3行ですみませんか。
No.1
- 回答日時:
★アイディア
・文字列の Unicode 文字判定の関数を1つ作って MessageBoxA()、MessageBoxW() 関数を
使えば良い。そうすれば、AnsiToUnicode_Size()、AnsiToUnicode_Convert() 関数は
必要なくなります。ただし、lpCaption と lpText の文字列の文字コードが両方とも
同じ場合に限ります。→擬似サンプル1です。
もしも、lpCaption と lpText の文字列の文字コードが両方とも違う場合は擬似サンプル2を使う。
・MessageBoxW() 関数で統一すれば #ifdef UNICODE の判定は必要ありませんよ。
擬似サンプル1:
if ( IsUnicode(lpCaption) ){
MessageBoxW( hWnd, lpText, lpCaption, MB_OK ); ←Ansi,SJIS 版の MessageBox
}
else{
MessageBoxA( hWnd, lpText, lpCaption, MB_OK ); ←Unicode 版の MessageBox
}
擬似サンプル2:
if ( !IsUnicode(lpCaption) ){
len_w = AnsiToUnicode_Size( lpCaption );
len_w *= sizeof(WCHAR);
wCaption = (LPWSTR)malloc( len_w + 1 );
AnsiToUnicode_Convert( lpCaption, wCaption );
lpCaption = (LPCSTR)wCaption;
}
if ( !IsUnicode(lpText) ){
len_w = AnsiToUnicode_Size( lpText );
len_w *= sizeof(WCHAR);
wText = (LPWSTR)malloc( len_w + 1 );
AnsiToUnicode_Convert( lpText, wText );
lpText = (LPCSTR)wText;
}
MessageBoxW( hWnd, lpText, lpCaption, MB_OK ); ←Unicode 版の MessageBox で統一する
●肝心の Unicode 文字判定
・文字列が Ansi だと決め付けて強制的に Unicode 文字に変換します。
その変換された文字列をこんどは強制的に Ansi 文字に変換します。
その後、最初の文字列と Ansi → Unicode → Ansi の変換した文字列を比較します。
文字列が完全一致したら本当に Ansi 文字列だった事になります。
もしも、文字列が不一致なら Unicode 文字の文字列だった事になります。
・こんなアルゴリズムで文字列の Unicode 文字判定の関数が作れませんか。
もし上手く出来たら上記の擬似サンプル1、または、擬似サンプル2の方法が使えます。
なお、擬似サンプル2の方法は最終的に Unicode 文字列に合わせて処理するため特に
#ifdef UNICODE の判定は必要ないと思います。
・以上。参考に!
回答ありがとうございました。参考になりました。Unicode 文字判定を作成してみたのですが。VC2005で「プロジェクトの既定値」→「文字セット」を、設定なしにしてコンパイルして、以下のIsUnicode()にUnicode文字列やANSI文字列を渡して動作させたのですが、うまくいきませんでした。間違いの箇所がどこなのかわかりません。問題ある箇所を教えていただければうれしいです。
BOOL IsUnicode( LPCSTR str )
{
intlen_w, len;
LPWSTRwstrbf;
LPSTRstrbf;
len_w = AnsiToUnicode_Size( str );
len_w *= sizeof(WCHAR);
wstrbf = (LPWSTR)malloc( len_w + 1 );
wmemset( wstrbf, 0, ( len_w + 1 ) );
if ( ! AnsiToUnicode_Convert( str, wstrbf ) ) {
//失敗
}
len = UnicodeToAnsi_Size( wstrbf );
len *= sizeof(CHAR);
strbf = (LPSTR)malloc( len + 1 );
memset( strbf, 0, ( len + 1 ) );
if ( ! UnicodeToAnsi_Convert( wstrbf, strbf ) ) {
//失敗
}
if ( lstrcmpA( str, strbf ) == 0 ) {
return FALSE;
}
return TRUE;
}
よろしくお願いします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# VisualStudioのソースコードで漢字を使いたい 4 2022/05/21 10:16
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Windows 8 win8 "ベータ ワールドワイド言語サポートで Unicode UTF-8 を使用"を出したい 2 2023/05/23 19:57
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) iMacのターミナルにユニコード文字を出す方法 2 2022/06/22 21:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excelの文字列を数字に変換する方法について 6 2023/07/31 21:18
- その他(コンピューター・テクノロジー) 重たいunicodeについて 今って重たい文字を使った荒らし行為って効果あるのですか? 最近はスマホ 1 2022/12/20 14:34
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
VC++でUTF-8のファイルを出力したい
C言語・C++・C#
-
visual c++の文字コード判別
C言語・C++・C#
-
-
4
UTF8→ShiftJISに変換したいです!
C言語・C++・C#
-
5
文字列の置換をCStringで(C++)
C言語・C++・C#
-
6
正負を反転させて出力するプログラム
C言語・C++・C#
-
7
UTF-8で5~6バイトになる文字コード
その他(プログラミング・Web制作)
-
8
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
9
int型の内容をbyteの配列にコピー
Java
-
10
ラジオボタンのグループ化
C言語・C++・C#
-
11
char*を初期化したいのですが
C言語・C++・C#
-
12
SJIS⇔UTF-8の文字コード変換
C言語・C++・C#
-
13
関数から配列を返すには?
C言語・C++・C#
-
14
printf による16進表示について
C言語・C++・C#
-
15
ファイルの途中に文字列を挿入
C言語・C++・C#
-
16
CString型からdouble型への変換
C言語・C++・C#
-
17
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
18
ラジオボタンの値の取得について(C++)
C言語・C++・C#
-
19
配列をnビットシフトする
C言語・C++・C#
-
20
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelはなんで先頭の0を消すん...
-
VBAでの Replace関数で、ワイル...
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列をtxtファイル...
-
マクロ処理でのループの記述に...
-
VBscriptからバッチに変数を渡...
-
エクセルで文字列の最大値を抽...
-
“丸(〇/○/◯)”に似た文字…
-
同一セル内に関数と文字列を同...
-
sedなどで、特定の文字列の後の...
-
A B C D E の五文字のすべてを...
-
エクセルでアルファベットか数...
-
MS Wordのテキスト ボックス フ...
-
StringGridで選択した箇所の文...
-
bashスクリプトでの文字列から...
-
Msgboxの×が押されたとき
-
VBscriptで、Excelのセルに文字...
-
Left関数とRight関数を合わせた...
-
delphiにて 文字列の最後の改...
-
[大学数学 形式言語]回文を受理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
sedなどで、特定の文字列の後の...
-
MS SQLServer のSQLで文字列の...
-
Left関数とRight関数を合わせた...
-
Msgboxの×が押されたとき
-
アクセスで特定の数字以外(複...
-
【Excel VBA】複数ある特定の文...
-
エクセルでセル内の文字列の最...
-
C#で年月を比較する
おすすめ情報