漢字英数字混在のANSI文字列のデェジット分解法とは?

このQ&Aのポイント
  • 漢字英数字混在のANSI文字列をディジット(数字)に分解する方法について説明します。
  • 漢字のANSI文字列は2バイト構成であり、その2バイトの先頭digit、2番目のdigit、3番目のdigit、最後のdigitを順次取り出します。
  • しかし、もし文字列の中に1バイト文字の英数字が含まれていた場合にはどうなるのでしょうか?漢字コードのdigit分解についても考慮が必要です。
回答を見る
  • ベストアンサー

漢字英数字混在のANSI文字列のデェジット分解法?

lpStringに漢字のANSI文字列が入っています 漢字ですので2バイト構成になっています その2バイトの先頭digit、2番目のdigit、3番目のdigit、最後のdigitを順次取り出します for (int i = 0; i<strlen(lpString); i++) { unsigned int TopDigit = lpString[i]; TopDigit = TopDigit >> 12; TopDigit = TopDigit & 0x000f; unsigned int SecondDigit = lpString[i]; TopDigit = TopDigit >> 8; SecondDigit = SecondDigit & 0x000f; unsigned int ThirdDigit = lpString[i]; ThirdDigit = ThirdDigit >> 4; ThirdDigit = ThirdDigit & 0x000f; unsigned int LastDigit = lpString[i]; LastDigit = LastDigit & 0x000f; 以下の処理は省略     } i<strlen(lpString)により文字列中の全文字をdigitに分解しております ここでハテ? なんです もし文字列の中に1バイト文字の英数字が含まれていたらどうなりますか? 漢字コードのdigit分解もこれで良いのでしょうか? int WORD = lpString[i] は漢字コードの時は2バイト、英数字の時は下バイトに1バイトが入るのでしょうか? 我ながらANSIコードの特性が分かっていないと思っています 漢字英数字混在の文字列のデェジット分解法をご教授願います

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

ご自分のやりたい事にかってな命名されても何の事なのか他者にはまったくわかりませんけど・・・ >int WORD = lpString[i] は漢字コードの時は2バイト、英数字の時は下バイトに1バイトが入るのでしょうか? そもそもlpStringの型は何なのですか? strlen()の引数とされてることからするとchar *だと思いますけど。 そこから考えればどうなるのかはわかるはずです。 漢字コードはまったくなんの関係もありません。

sato-may
質問者

お礼

ありがとうございます 寝ぼけておりました 『漢字コードはまったくなんの関係もありません』の一言で気が付きました お世話様でした

関連するQ&A

  • マルチバイト混在の文字列整形

    OS: Linux Ubuntu 言語: C++ 引数でchar*型の文字列配列(マルチバイト含む)を受け取り 指定した幅で枠つきで文字列を出力したいのですがうまくいきません。 作りたい出力 ━━━━━━━ ┃1: あいうえお┃ ┃2: かきく   ┃ ┃3: abc    ┃ ━━━━━━━ - str[] = {"あいうえお", "かきく", "abc"} - あいうえおの後ろは空白なし - 他は空白と文字列を合計してあいうえおと同じ長さに合うように 私の環境では日本語は3byteと認識され  strlen("あいうえお") = 15 となります。 イメージでは for (i = 0; i < strlen(str[])の最大値; i++) { cout << "┃" << i << ":" << setw(15) << left << str[i] << "┃" } のようなコードになると思うのですが 日本語一文字が出力上は2byte分の幅に見えるのに 認識としては3byteになってしまうので空白が1byte多くなり ━━━━━━━ ┃1: あいうえお┃ ┃2: かきく    ┃ ┃3: abc       ┃ ━━━━━━━ のようにずれてしまいます。 (表記上、最初の枠もずれていますが  現状は足りない分を埋めるsetfillが余計に働いてしまうということです。) 何か対策はありますでしょうか?

  • 英数字は後ろから何文字目まで?

    エクセルで、前側は数字、中臍は平仮名と漢字、後側は英数字の文字列が、複数のコラムに沢山存在します。 後側の後側は英数字の文字列は重要なので、赤くしたいのですけれど、後ろからカウントしていって何文字目までが英数字であるかを知りたいのですが、どなたか教えて下さい。お願いします。

  • 文字列をint型にキャスト

    文字列をunsigned int型キャストし,それをある演算をして 正の整数に変換したいのですがどうすればいいですか? int ca(char *s) { unsigned int h; int key; h = (unsigned int)s; //文字列を演算し 0~254 の整数にする// key = h % 254; return key; } int main() { char moji[32]; moji = "moji"; unsigned int c; c = ca(moji); }

  • ファイルから16進数文字列として読み込めない

    例えば 2b7e151628aed2a6abf7158809cf4f3c のうようなファイルを 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c ------(*) のような16個の配列からなる数字列として考えて読み込むにはどうすればよいでしょうか?うまく思いつきません。 なお、 unsigned char num[16]; (上記の数字列を入力) for(int i=0; i<16; i++) printf("%x", num[i]); を実行すると(*)のように表示されるようにしたいです。 詳しい方よろしくお願いします。

  • 暗号化文字列を英数字のみにしたい

    文字列をJavaで暗号化してURLのクエリストリングに付加したいのですが、「=」「+」等の記号が含まれるとURLエンコーディングしないといけません。 こちらの都合上それを防ぎたいので、暗号化後の文字列を半角英数字のみで構成されるようにしたいのです。 いい案があればご教授ください。 尚、現在はアルゴリズムBlowfishで暗号化したバイト配列をBase64方式にてエンコードしています。 それですと記号が含まれてしまいます。

    • ベストアンサー
    • Java
  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

  • 文字列の中の2バイト文字と英数字を分割

    $str = "ブックbook01本comicこみっく123"; のような2バイト文字と英数字が混在している文字列があります。 これを2バイト文字と英数字で分割して 1. 配列に入れる方法   →Array('ブック', 'book01', '本' 'comic', 'コミック', '123') 2. 間に空白を入れる方法   →"ブック book01 本 comic こみっく 123" の両方の処理の仕方を教えて下さい。

    • 締切済み
    • PHP
  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • 文字列をハッシュにしなければならないのですが

    C言語にさ ファイルの中にある、3バイトunicodeの漢字文字列郡をハッシュテーブルに格納してハッシュを作りたいんですが、取っ掛かりすらつかない状況です。 とりあえず、配列から3バイトの16進数にして、後はその文字列分の16進数を足して、それを割ってキーをつくりテーブルにいれる、としようとしています。 配列から3バイトの16進数にする int joint(char a, char b, char c){ int join = 0; join = a<<8; join = (0x0000FF00 & join) + (0x000000FF & b); join = join<<8; join = (0x00FFFF00 & join) + (0x000000FF & c); return join; } このように16進数にするのですが、最初の取っ掛かりとしてのハッシュについては、どうやったらハッシュテーブルに格納でくるのかいまいちわからないのです。誰かわかりやすく教えてください。

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

専門家に質問してみよう