C++についての質問です。
簡単な質問で大変申し訳ございません。
'\'や'&'などSQLインジェクションに
関係する文字コードについて
空白に変換する処理をいれていたところ、
カタカナの「ソ」(%83%5c)など
も変換されてしまい、
文字化けしてしまうという現象が起きています。
'\'は、'%5c'のため、カタカナの「ソ」は、
それと同じ'5c'のコードが
2バイト目入ってしまっているからだと
いう原因までは、
把握しているのですが、
対処の仕方がわかりません。
簡単な質問で申し訳ございませんが
ご教示願います。
No.3ベストアンサー
- 回答日時:
文字コードを空白に変換するというのは危ないのではないでしょうか。
文字化けが起きたということはそのコードの中の1ビットが化けたか、データが混入したか、脱落したかが考えられます。それのどれであるかということは前後のデータの並び方から推定する他はないのですが、これはかなり大変な作業になります。ですからデータを頭から正しいものと決め込んで特殊コードを空白コードに変換する作業を機械的に行なうということは大変危険な作業であるということになり、文字化けが起きたときには作業を中止し、その原因を推定するルーチンに飛込むようにしなければなりませんね。
今回の場合はデータがずれてしまっているようですから、これは1ビット脱落したか混入したかのどちからですから、場合に分けたルーチンを用意するのも一つの手段かと思います。
いずれにせよ、データをいじるのは大変危険な作業なので、薄氷を踏むような用心が必要ということになりますね。
私が現場でやっていた頃はまだすべて2バイトコードでしたが、それでも血の出るような思いを何度もしたことがあります。御苦労はお察ししますよ。
参考URL:http://home.a03.itscom.net/tsuzu/programing/tips …
お忙しい中、返信くださいまして
どうもありがとうございます。
実際に行っている処理としては、
「サシスセソ」という文字列に
「\」、「'」、「"」、「&」などの不正コードが
入力されてしまった場合は、
// 文字列除去処理
int find_len = strlen(find);
char *start = str;
char *hit;
while ( ( hit = strstr(start, find) ) ){
strcpy( hit, hit+find_len );
}
不正文字を詰めるようにしています。
ただし、上記処理をあらゆる文字に対し行った場合は、
文字が落ちてしまうため、
2バイト文字については、文字列除去処理を行いたくありません。
そこで、以下の処理を書いています。
#define 2bytechar(c) ((((unsigned char)(c))!=0x7F)&&(((unsigned char)(c))>=0x40)&&(((unsigned char)(c))<=0xFC))
for ( i=0; str[i] != '\0' i++ ) {
if ( 2bytechar( str[i] ) ){
//進める
i++;
} else {
//文字列除去処理呼び出し
}
しかし、
上記の場合は、
「サシスセソ」が文字化けすることはなくなりましたが、
「\サシスセソ」とした場合は、
「\」が削除されなくなってしまいました。
どのように対応すればよいでしょうか?
拙い文章な上に、
細かい部分まで質問してしまいまして
申し訳ございませんが、
宜しくお願い申し上げます
No.5
- 回答日時:
> #define 2bytechar(c) ((((unsigned char)(c))!=0x7F)&&(((unsigned char)(c))>=0x40)&&(((unsigned char)(c))<=0xFC))
このマクロのロジック間違っていませんか?
後の処理とあわせて考えると多分ShiftJISの上位バイトとみなせる
ときに下位バイトを処理対象からはずすということをしたいのでしょうけど、
上記のマクロでは
1. 0x7f ではなく
2. 0x40 <= x <= 0xFC
の範囲にあるキャラクタのときに真になりますから、'\'をこのマクロに
食わせると真になってしまいます。
ShiftJISの上位バイトの分布をもう一度見直してみては?
もしWindows上のC処理系を使っているのなら、判定を行ってくれる関数が多分ありますし、Windows APIにも存在しています。
No.4
- 回答日時:
>「\サシスセソ」とした場合は、「\」が削除されなくなってしまいました。
ご呈示のロジックなら独り¥だけが残る筈がありませんよね。これはC++のスペックで \ に何か特殊の意味を与えていて、組み込み関数がこれを無視するからではないかと推測します。
ですからこれの対策は1バイトを切出したときに組み込み関数で2バイトコードと1バイトコードを弁別するのをやめて、ビットオペレーションを使い、自前で判断することでしか解決できないと思います。コード表をにらみながら効率的なルーチンを編み出してください。20年若ければご一緒に考えるところですが、古稀に近くなるともうダメです(^_^;)
No.2
- 回答日時:
拡張文字集合の扱いは、今直面している0x5cの問題だけでなく、その他のこともすべて視野に入れた上で、どうすべきか決定する必要があると思います。
文字列中の文字をランダムアクセスする頻度が赤いのであればワイド文字列に直した方がよいでしょうし、文字列の順序付けを変更したくないのであれば、シフトJISのままにしておく必要があります。
No.1
- 回答日時:
がると申します。
基本的にはshift-jisに起因する問題になります。
ですので、対応策としては
・文字コードをあらかじめshift-jis以外(通例EUC。最近だとUTF-8であることも多い)に変換する
・Shift-jisコードであるかどうかを1バイト目の値で判断する
のいずれかになるかと思います。
とりあえずお勧めは1番目でしょうか?
結局のところ、こういう部分が「内部処理でsjis使うな」といわれている所以なので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- 物理学 量子力学のテキストのフーリエ変換の記述について 1 2022/10/16 17:00
- Excel(エクセル) Excelのリストにある文字を含むセルを、複数の色で色付けしたいです 2 2022/08/11 17:39
- その他(プログラミング・Web制作) 変換のプログラムを教えてください。 6 2023/07/01 09:57
- Access(アクセス) capeofdragonと申します。 Access2016を使っております。 あるフォームがあり、テ 2 2022/09/09 13:18
- その他(Microsoft Office) Microsoft Excelの文字変換で教えて下さい。 商社勤務です。 営業マンと言う言葉と○万な 2 2022/04/23 11:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
ExcelVBA実行後に時々落ちる
-
std::stringからLPCWSTR型への変換
-
sedで日本語の置換方法について
-
CASLⅡ 文字データから数値デー...
-
%fと%gについて
-
Excelマクロにて30分単位の計算...
-
1をA、2をB・・・に変換したい
-
バイナリデータ→ASCII 変換プ...
-
XMLデータの中の改行コードにつ...
-
フォームのコントロールのバッ...
-
C#で16進数からASCIIへの変換の...
-
ExcelからVBAでWordを操作する...
-
入力した文字を全て自動で全角...
-
Symfowareでのデータ型変換につ...
-
ふりがなをアルファベット化す...
-
VB.NET TextBoxへの入力をキャ...
-
S-JIS → JIS コード変換するには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
ふりがなをアルファベット化す...
-
英数字を含む文字列(0-9,A-Z)...
-
VS 2008(VB.NET)
-
Symfowareでのデータ型変換につ...
-
S-JIS → JIS コード変換するには
-
CString ←→ BSTRの変換について
-
数字5桁文字コード?
-
10進数→2進数への変換
-
2バイト文字をJEFからSJISに変...
-
JIS → S-JIS コード変換するには
-
EBCDICへの変換
-
RubyでUTF8のコード値を文字に...
-
latin-1 (ISO-8859-1)への変換
おすすめ情報