• 締切済み

C言語のプログラミングで文字コードを表示する方法を教えてください。

ファイル名<sample-utf8.txt> 32 30 30 38 e5 b9 b4 35 e6 9c 88 32 37 e6 97 a5 0d 0a ef bc 92 ef bc 90 ef bc 90 ef bc 98 e5 b9 b4 ef bc 95 e6 9c 88 ef bc 92 ef bc 97 e6 97 a5 0d 0a e8 a8 88 e7 ae 97 e6 a9 9f e3 82 b7 e3 82 b9 e3 83 86 e3 83 a0 ef bc 91 テキストメモの文字を表示するプログラムをC言語で作りたいのですがわかりません。どなたかソースコードを教えていただけると助かります。よろしくお願いします。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.2

>どなたかソースコードを教えていただけると助かります。  年寄りが、頭の体操を兼ねて作ってみました(BorlandC++5.5.1, win2k)。  ずいぶんとダダラとなってしまい・・。 ・sample-utf8.txt を見ると、3バイトコード文字がレコード(行)を跨いでいるのですね・・。  これにより、ソースが若干複雑になっています。→ 改行までを配列に格納 → 処理  処理:utf8 → unicode → sjis という複雑なことやっています。  複雑な理由:下の表を見つけたもんで・・。   http://homepage3.nifty.com/aokura/src/cp932.html ★ #include <stdio.h> #define un_shrt unsigned short char cHexa[ 32 ] = "0123456789abcdef"; typedef struct{  un_shrt unicode;  un_shrt sjiscode; }CONVTABLE; const CONVTABLE conv_table[ 16 ] = {  { 0x30B7, 0x8356 }, { 0x30B9, 0x8358 }, { 0x30C6, 0x8365 }, { 0x30E0, 0x8380 },  { 0x5E74, 0x944E }, { 0x6A5F, 0x8B40 }, { 0x65E5, 0x93FA }, { 0x6708, 0x8C8E },  { 0x7B97, 0x8E5A }, { 0x8A08, 0x8C76 }, { 0xFF10, 0x824F }, { 0xFF11, 0x8250 },  { 0xFF12, 0x8251 }, { 0xFF15, 0x8254 }, { 0xFF17, 0x8256 }, { 0xFF18, 0x8257 } }; int Unicode2SJIS( int iVal ) {  int i;  for( i = 0; i < 16; i++ ){   if( (un_shrt)iVal == conv_table[ i ].unicode ) return( (int)conv_table[ i ].sjiscode );  }  fprintf( stderr, "★より補充してください { 0x%04X, 0xxxxx },\n", iVal );  return( 0x81A0 ); } int toDecimal( char a ) {  int i;  for( i = 0; i < 16; i++ ){   if( a == cHexa[ i ] ) return( i );  }  return( 0 ); } int toUnicodeA( char aaaa, char bb0, char bb1 ) {  int iVal;  iVal = toDecimal( aaaa ) << 4;  iVal += ( ( 0x03 & toDecimal( bb0 ) ) << 2 );  iVal += ( toDecimal( bb1 ) >> 2 );  return( iVal ); } int toUnicodeB( char cc0, char cc1, char dddd ) {  int iVal = 0;  iVal += ( ( 0x03 & toDecimal( cc0 ) ) << 6 );  iVal += ( ( 0x03 & toDecimal( cc1 ) ) << 4 );  iVal += toDecimal( dddd );  return( iVal ); } void Henkan( char cWork[], char cStr[], int nn ) {  int i, k = 0;  int iUni, iSjs;  for( i = 0; i < nn; i += 3 ){   if( '3' == cWork[ i ] ){ // ASCIIコード 数字    cStr[ k++ ] = cWork[ i + 1 ];    cStr[ k ] = '\0';    continue;   }   iUni = toUnicodeA( cWork[ i + 1 ], cWork[ i + 3 ], cWork[ i + 4 ] ) << 8;   iUni+= toUnicodeB( cWork[ i + 4 ], cWork[ i + 6 ], cWork[ i + 7 ] );   iSjs = Unicode2SJIS( iUni );   cStr[ k++ ] = (char)( iSjs >> 8 );   cStr[ k++ ] = (char)( ( iSjs << 8 ) >> 8 );   cStr[ k ] = '\0';   i += 6; // 3バイトコード調整  } } int main() {  int i, nn = 0;  char cBuf[ 256 ], cWork[ 2048 ], cStr[ 1024 ];  FILE *fp;  fp = fopen( "sample-utf8.txt", "r" );  if( NULL == fp ) return( -1 );  while( NULL != fgets( cBuf, 256, fp ) ){   if( nn ){    cWork[ nn++ ] = ' ';    cWork[ nn ] = '\0';   }   for( i = 0; i < 256; i++ ){    if( cBuf[ i ] < ' ' ) break; // 行末    if( ( '0' == cBuf[ i ] ) && ( 'd' == cBuf[ i + 1 ] ) ){ // 改行     Henkan( cWork, cStr, nn );     printf( "%s\n", cStr );     nn = 0;     i += 5; // 0a skip     continue;    }    cWork[ nn++ ] = cBuf[ i ];    cWork[ nn ] = '\0';   }  }  fclose( fp );  if( nn ){   Henkan( cWork, cStr, nn );   printf( "%s\n", cStr );  }  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

sample-utf8.txtというファイルに"32 30 … 91"と書かれていて、その内容を「UTF8の文字列の文字コードを16進表記したもの」とみなして、元のUTF8の文字列の内容を表示したいということでいいですか? C言語では文字コードの扱いはプラットフォームによって異なるので、対象のOSやコンパイラを明らかにしてください。 たとえば、UTF8に対応している端末ならば下記のプログラムだけでもほぼ目的を達することができてしまいます (sample-utf8.txtの内容は標準入力から読み込む想定)。 #include <stdio.h> int main() { char c; while (scanf("%hhx", &c) > 0) { putchar(c); } return 0; } ところで、なぜ2008年?

関連するQ&A

  • htmlソースを解析、日本語部分がよくわからない

    htmlソースを解析しようと思ったのですが、日本語部分がバイト表現のようなものになっています。 (thunderbirdでソースを見ています) 例えばメールでは「注文内容」となっている部分はhtmlソースでは以下のようになっています。 =E6=B3=A8=E6=96=87=E5=86=85=E5=AE=B9=EF=BC=9A ヘッダの文字コードはutf-8になっていました。 このバイト表現はどのような文字コードなのでしょうか? またPHPやVBA、C#などで日本語への変換は可能でしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • HTML
  • C言語のInvokeHelper

    C言語素人です。下記のソースに似たようなものですが、ここでいうInvokeHelperは何をどう呼出しているのでしょうか。具体的にどこらへんを読んでいけばいいんでしょうか。お願いします。 http://svn.openfoundry.org/aesds2/%E7%89%A9%E4%BB%B6%E5%AE%9A%E4%BD%8D%E7%A8%8B%E5%BC%8F/PTZ%E5%8A%A0%E5%85%A5opencv/axismediacontrol.cpp void CAxisMediaControl::StartRecord(LPCTSTR theFile) { static BYTE parms[] = VTS_BSTR; InvokeHelper(0x68, DISPATCH_METHOD, VT_EMPTY, NULL, parms, theFile); }

  • googleMapについて

    googleMapへのリンクについてお伺いさせて頂きます。 例えば新宿区役所のマーカーがついたgoogleマップへのリンクを貼りたい場合、 <a href="http://maps.google.co.jp/maps?f=q&source=s_q&hl=ja&geocode=&q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E5%8C%BA%E6%AD%8C%E8%88%9E%E4%BC%8E%E7%94%BA%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%94%E2%88%92%EF%BC%91&mrt=all&sll=35.715159,139.703522&sspn=0.042928,0.110722&brcurrent=3,0x60188cd830801b7d:0xe0f6240d595a66e7,0&ie=UTF8&hq=&hnear=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E5%8C%BA%E6%AD%8C%E8%88%9E%E4%BC%8E%E7%94%BA%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%94%E2%88%92%EF%BC%91&z=15">新宿区役所</a> というタグを自サイトに貼りつければリンクを貼り付けられますますよね? これを新宿区役所と新宿駅の2つのマーカーが付いたgoogleMapへのリンクを貼りたいのですが、 このような事は可能でしょうか? (複数マーカーがついたgoogleMapへのリンクを貼りつけたい) APIを使い、自サイトに地図を貼り付ける形であれば可能というのは分かっているのですが、 あくまでリンクで対応したいので。。 何卒宜しくお願い致します。

    • ベストアンサー
    • HTML
  • C言語 int main(void) main()

    C言語のmain関数について、質問させていただきます。 私の手元に、林 晴比古さんが執筆された著書、 2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本] http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1 があります。 これと同一の2000年度版の著書、 http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%9E%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797306718/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1383091260&sr=1-1-catcorr&keywords=%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80+%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8 も、所持しています。 main関数の書き方が、2007年度版の新しい方では、 int main(void) { } と記載されており、 2000年度版の古い方では main() { } と記載されています。 改訂版なので両者を同じページで内容や例題を照らし合わせても、この部分が変わっていることを確認できます。 つまり、2007年度版では、2000年度版では書かかなくてよかった「void」を、一新して記載するようになっています。 ここで質問ですが、両方のやり方で、コンパイルすると両方ともエラーなくきちんと表示されます。しかしこれはどのような理由で変更されたのでしょうか? 詳しい方がいましたら、ご回答よろしくお願い申し上げます。

  • C言語プログラミング

    C言語プログラミングに関して質問です。 元本、年数、単利、複利を順にa,b,c,dと置き、年数経過後の単利、複利の場合のそれぞれの額をe,fとしたとき、 e = a+(a*c)*b となるのはわかるのですが、複利の場合の金額を求める時の計算式はどう書けばよいのですか。 また、複利が単利より小さい時、何年後に複利のときの金額が単利のときの金額を越すかを表示したいのですが、次の書き方で合ってますか。 if(d < c){ b = 2; while(1){ if(f > e) break; else b++; } printf("%d年後、単利のときの金額を複利のときの金額が追い越します\n",b); }

  • エスティマの荷台について!(+交通費)

    教えて下さい。 近々、私が引越しをするにあたって、友達が 『エスティマに乗ってるから沢山積めるし、引越しを手伝ってあげる』と声をかけてくれました。 そこで質問です。 私の荷物の量は、だいたい以下になります。 ● ダンボール120サイズを12個。 http://www.amazon.co.jp/%E3%83%A1%E3%83%AB%E3%82%A2%E3%83%89%E4%BE%BF%E8%B3%87%E6%9D%90%E9%83%A8-%E3%83%80%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%AB%E7%AE%B1%EF%BC%88%E5%AE%85%E9%85%8D%E3%82%B5%E3%82%A4%E3%82%BA%EF%BC%91%EF%BC%92%EF%BC%90-%E6%AE%B5%E3%83%9C%E3%83%BC%E3%83%AB%E7%AE%B1%EF%BC%89-L%EF%BC%8D%EF%BC%96-%EF%BC%91%E6%9E%9A/dp/B007THEH7O/ref=sr_1_1?ie=UTF8&qid=1392448960&sr=8-1&keywords=%E3%83%80%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%AB120 ● カラーボックス。こちらは組み立ててない状態のモノ。4つ http://www.amazon.co.jp/%E5%B1%B1%E5%96%84-YAMAZEN-3%E6%AE%B5%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-GCB-3-WH/dp/B003O69RZG/ref=sr_1_1?ie=UTF8&qid=1392449047&sr=8-1&keywords=%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9 ● 電気ストーブ (箱なし!むき出し) 1つ http://www.amazon.co.jp/%E3%83%80%E3%82%A4%E3%82%AD%E3%83%B3-%E9%81%A0%E8%B5%A4%E5%A4%96%E7%B7%9A%E6%9A%96%E6%88%BF%E6%A9%9F%E3%80%8C%E3%82%BB%E3%83%A9%E3%83%A0%E3%83%92%E3%83%BC%E3%83%88%E3%80%8D-%E3%82%B9%E3%83%9D%E3%83%83%E3%83%88%E3%83%BB%E3%83%AF%E3%82%A4%E3%83%89%E3%83%92%E3%83%BC%E3%83%88%E6%90%AD%E8%BC%89-%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC-CER11NS/dp/B009C054WI/ref=sr_1_1?ie=UTF8&qid=1392449117&sr=8-1&keywords=%E3%82%BB%E3%83%A9%E3%83%A0%E3%83%92%E3%83%BC%E3%83%88 ● テレビ。 と、こんな感じです。 これらのモノを、積めるでしょうか? また、積めたとして、どれくらい余裕がありますか? それから・・・もう一つお願いします。 住む場所までの距離が、だいたい100キロ先として、ネットのルートナビで見てみたら、1時間45分くらいで到着。料金が4450円となっていました。それプラス、ガソリン代になりますよね。いくらその友達にお支払いすればいいでしょうか?一応友達は、日当やら手間賃は要らないと言ってくれているので、交通費としていくらくらいでしょうか? 友達に直接聞くと、『いいよいいよ』と言われそうなので、こちらで質問させてください。

  • SPI対策本について

    現在大学3年生で就職活動を控えている者です。 SPI対策本を買いたいのですが、 種類が多くてどれを買ったら良いのか全く分かりません… 志望企業など決まっていないため、 テストセンター対応か、WEBテスト対応か、 また普通のSPI対策本を買うべきなのか、 迷ってしまっています… 調べたところ、SPIノートの会から出されている本が 一番良いと色々な所で書かれているのですが テストセンター対応等分かれているため どれを買うべきなのか、と… 次に調べた結果、日経から出されている本が 全て対応している、とのことだったのですが レビューやこの本に関しての感想があまりないため 迷っています。 どちらを買ったらよいでしょうか? また他にお勧めの対策本等があったら教えて頂きたいです。 よろしくお願いします。 SPIノートの会 http://www.amazon.co.jp/s/ref=nb_sb_ss_i_1_7?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dstripbooks&field-keywords=spi%83m%81%5B%83g%82%CC%89%EF+2013&sprefix=SPI%83m%81%5B%83g%82%CC 日経 http://www.amazon.co.jp/%E3%81%93%E3%81%AE%EF%BC%91%E5%86%8A%E3%81%A0%E3%81%91%E3%81%A7%EF%BC%B3%EF%BC%B0%EF%BC%A9%EF%BC%92%E3%82%92%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87%EF%BC%81-%EF%BC%B3%EF%BC%B0%EF%BC%A9%EF%BC%92%E3%81%AE%E5%AE%8C%E7%92%A7%E5%AF%BE%E7%AD%96-%EF%BC%92%EF%BC%90%EF%BC%91%EF%BC%93%E5%B9%B4%E5%BA%A6%E7%89%88-%E6%97%A5%E7%B5%8C%E5%B0%B1%E8%81%B7%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E6%9D%91%E4%B8%80%E6%A8%B9/dp/4891121246/ref=sr_1_1?s=books&ie=UTF8&qid=1321328696&sr=1-1

  • ペイントって生データーとして保存できないの?

    ペイント:お絵かき/画像編集ソフト・・ ペイントって画像ファイルでしか保存できなにのでしょうか? 例えば,1つのお絵描きを時間の都合で3日に分けて絵を描きたい場合・・ 作業途中の画面を保存しておきたいですよね? でも,保存の拡張子は画像ばかりです。 これって3日目には画質が落ちませんかね~? 例えば,PNGの保存の場合・・ 1日目(PNG)    ↓ 2日目(PNG)    ↓ 3日目(PNG)    ↓  画質劣化 これが生データーとして最終3日にPNGで保存できれば劣化はないと思いますが。 (質問) 画質を落とさずにお絵描きをするなら,1回で終了させるしか方法はないのでしょうか? ペイントにお詳し方,宜しく願います。 (参考) https://natubunko.net/paint/paint10-001c.html#:~:text=%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BF%9D%E5%AD%98%201%20%E2%97%86%20%E4%B8%8A%E6%9B%B8%E3%81%8D%E4%BF%9D%E5%AD%98%20%E3%81%9D%E3%81%AE%EF%BC%91%EF%BC%9E%E5%B7%A6%E4%B8%8A%E3%81%AE%E3%80%94%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%95%E3%82%BF%E3%83%96%E2%88%92%E3%80%94%E4%B8%8A%E6%9B%B8%E3%81%8D%E4%BF%9D%E5%AD%98%EF%BC%88S%EF%BC%89%E3%80%95%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%80%82%20%E3%81%9D%E3%81%AE%EF%BC%92%EF%BC%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%EF%BC%BBCtrl%EF%BC%BD%EF%BC%8B%EF%BC%BBS%EF%BC%BD%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E6%8A%BC%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20...%202,%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8C%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20...%203%20%E2%97%86%20%E3%83%9A%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%82%E4%BA%86%20%E2%97%86%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%20%E3%81%9D%E3%81%AE%EF%BC%91%EF%BC%9E%E3%83%84%E3%83%BC%E3%83%AB%E3%83%90%E3%83%BC%E5%8F%B3%E4%B8%8A%E3%81%AE%EF%BC%BB%C3%97%EF%BC%BD%E5%8D%B0%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%20

  • 「二の字点」の表示方法を教えてください

    IEやWordで「二の字点」(http://ja.wikipedia.org/wiki/踊り字#.E4.BA.8C.E3.81.AE.E5.AD.97.E7.82.B9.EF.BC.88.E3.81.AB.E3.81.AE.E3.81.98.E3.81.A6.E3.82.93.EF.BC.89)が表示できなくて困っています。 "Arial Unicode MS"を入れてみてもダメでした。 どなたか原因や対処方法をご存知でしたら是非教えてください。 お願いします。

  • つぎの文字はなんという言語

    次のURLの文字はなんという言語でどの国、または地域でつかわれるものでしょうか? https://www.google.co.jp/search?q=%E0%B4%AE%E0%B4%A3%E0%B5%8D%E0%B4%9F%E0%B5%87%E0%B4%B2%E0%B4%95%E0%B5%8D%E0%B4%95%E0%B5%8D%E2%80%8C+%E0%B4%86%E0%B4%A6%E0%B4%B0%E0%B4%BE%E0%B4%9E%E0%B5%8D%E0%B4%9C%E0%B4%B2%E0%B4%BF%E0%B4%95%E0%B4%B3%E0%B5%8D%E2%80%8D&oq=%E0%B4%AE%E0%B4%A3%E0%B5%8D%E0%B4%9F%E0%B5%87%E0%B4%B2%E0%B4%95%E0%B5%8D%E0%B4%95%E0%B5%8D%E2%80%8C+%E0%B4%86%E0%B4%A6%E0%B4%B0%E0%B4%BE%E0%B4%9E%E0%B5%8D%E0%B4%9C%E0%B4%B2%E0%B4%BF%E0%B4%95%E0%B4%B3%E0%B5%8D%E2%80%8D&sourceid=chrome&espv=210&es_sm=122&ie=UTF-8

専門家に質問してみよう