• ベストアンサー

文字を変換したい

こんにちは。 文字列を変換したいのですが、私はコードについて詳しく知らないため、どなたかご存知の方がおられましたら、ご教授をお願いいたします。 質問1: 文字列の変換例を以下に書きます。文字列を左から右へ変換する方法を教えてください。 41→A 42→B 43→C : Unicodeと文字列に対応していると思います。 質問2: 質問1のやり方を色々と調べて見たのですが、以下のサイトを参考にし、'41'という文字列を渡してみたのですが、'A'と出力してほしいのに、'41'がそのまま表示されてしまいました。http://blogs.sqlpassj.org/akiraonishi/articles/4229.aspx Unicodeの認識がないせいか、この辺りの仕組みがよく分かりません。 上記サイトでやろうとしていることと、質問1でやろうとしていることは違うのでしょうか。 以上につきまして、心当たりのある方はお願いいたします。

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

  • ベストアンサー
  • -izayoi-
  • ベストアンサー率45% (48/105)
回答No.3

参考サイトのコードはあまり詳しく読んでいないのですが、たぶん文字コードの変換(文字→文字)を行っているだけなので、質問者さんがやりたい事とは違います。 質問者さんがやりたいのは、「"41"という文字列を、0x41というコードと解釈して、0x41に割り当てられている文字コードに変換する(文字→コード→文字)」という事だと思います。 この場合まず、「"41"という文字列を、0x41というコード(整数値)に変換する」処理が必要です。コード(整数値)に変換できれば、後はそのコードをputchar()等で出力すれば良いです。 以下にコーディング例を示します。引数に与えられた文字列を変換して、標準出力へ結果を出力します。(ベタなやり方です。もっと賢い方法もあるように思いますが・・) なお、このコードをWindows上で実行した場合は、与えられた文字列が「SJISの16進コード」という扱いになります。(putchar()の結果が、そのシステムで使用している文字コードとして扱われるということです。) Unicodeや他のコード系として処理する場合は、整数値に変換した後、それぞれのコードへの変換処理を行って下さい。 #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) {   char  *pStr, *pEnd;   char  buff[4];   long  val;   if(argc < 2)  return 0;      pStr = argv[1];   while(pStr[0]) {     if(!pStr[1]) {       fprintf(stderr, "\n\n文字コードの終端が不正です。\n");       return 1;     }     buff[0] = pStr[0];     buff[1] = pStr[1];     buff[2] = '\0';     val = strtol(buff, &pEnd, 16);     putchar(val);     pStr += 2;   }   return 0; }

kerberos_001
質問者

お礼

ご回答ありがとうございます。 質問内容が説明不足で、申し訳ありませんでした。 やりたい事というのは、おっしゃるとおりで、文字コードに変換する(文字→コード→文字)なのです。 回答者さんのコード内容で無事解決できました。 どうもありがとうございました。

その他の回答 (3)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.4

質問1について Unicodeですか? 補足要求1:元コード(数字?)はUCS-2・UTF-8のどちらですか。(多分UCS-2でしょうけど) 補足要求2:出力文字はUCS-2でいいのですか?それともutf-8や、他のeuc等のJIS系文字コードでしょうか。 もしUCS-2でしたらBOMはどうしましょうか。 もしかして、文字列を値にしたい、というレベルの話でしたら、atoiやstrtolなどの関数の仕様を調べてください。このレベルでしたら、unicodeかどうかはまったく関係ありません。 質問2について こちらは一応回答です。 件のサイトを見ましたが、これはutf-8からShift_JISに直接文字コード変換を行うプログラムの解説です。文字コードの変換そのものはwindowsのnlsライブラリに頼っており、文字コードについては参考になるわけではありません。 したがって、質問1はなにを出力したいのかをおっしゃっていただけませんとどうしようもありません。 質問2はご希望の動作と紹介されているプログラムは次元が違うところで議論しているのではないかと思います。

kerberos_001
質問者

お礼

ご回答ありがとうございます。 質問内容が説明不足で、申し訳ありませんでした。 やりたい事というのは、No3さんのおっしゃるとおりで、文字コードに変換する(文字→コード→文字)なのです。 No3さんのコード内容で無事解決できました。 どうもありがとうございました。

回答No.2

失礼。 #1> 数値41を文字'A'も変換するのですか? 文字'A'に のマチガイです。 どうやら16進数から文字への変換ということのように思われます。 以下のコードで'A'が表示されますから。 #include <iostream> #include <locale> int main() {   std::locale::global(std::locale("ja"));   std::wcout << L"\x41";   return 0; }

kerberos_001
質問者

お礼

ご回答ありがとうございます。 質問内容が説明不足で、申し訳ありませんでした。 やりたい事というのは、No3さんのおっしゃるとおりで、文字コードに変換する(文字→コード→文字)なのです。 No3さんのコード内容で無事解決できました。 どうもありがとうございました。

回答No.1

- 文字列"41"を文字列"A"に変換するのですか? - 数値41を文字'A'も変換するのですか?  (41は10進表現ですか? 16進ではありませんか?)

kerberos_001
質問者

お礼

ご回答ありがとうございます。 質問内容が説明不足で、申し訳ありませんでした。 やりたい事というのは、No3さんのおっしゃるとおりで、文字コードに変換する(文字→コード→文字)なのです。 No3さんのコード内容で無事解決できました。 どうもありがとうございました。

関連するQ&A