質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Q&A

解決済

1回答

8772閲覧

curlにて LINE Notifyに通知を送ると文字化けしてしまいます。

KENTA2015

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

2グッド

3クリップ

投稿2017/08/12 06:17

編集2017/08/13 02:08

現在C言語で、あるテキストファイル(utf8)を読み込み、その文章をcurlを使用してLINENotifyに通知を送るプログラムを組んでいます。
しかし、テキストファイルをパソコンにてメモ帳などのエディタを使って開くと文字化けはしていないのですが、ラインで受信したメッセージは文字化けしています。
ただ文字化けと言っても一部だけで、例えば「質問回答サイト」が「質問回答サイチE」みたいな感じです。
試しに文字列変数の配列の中身を調べましたが、
文字列:質問回答サイト
str[0] = ffffe8
str[1] = ffffb3
str[2] = ffffaa
str[3] = ffffe5
str[4] = ffff95
str[5] = ffff8f
str[6] = ffffe5
str[7] = ffff9b
str[8] = ffff9e
str[9] = ffffe7
str[10] = ffffad
str[11] = ffff94
str[12] = ffffe3
str[13] = ffff82
str[14] = ffffb5
str[15] = ffffe3
str[16] = ffff82
str[17] = ffffa4
str[18] = ffffe3
str[19] = ffff83
str[20] = ffff88

といったように間違った値は入っていませんでした。

原因がわかる方いたらぜひ教えて下さい。

環境はwindowsです。
プログラム自体はexeファイルです。

ソースは以下のとおりです。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define MAX2 170 5 6int main(void){ 7FILE *file = fopen("test.txt","r"); 8char buf2[MAX2]={0}; 9char str1[400]="curl -k -X POST -H \"Authorization: Bearer *********************\" -F \"message="; 10char str2[150]="\" https://notify-api.line.me/api/notify"; 11 12 13fgets(buf2,MAX2,file); 14 15strcat(str1,buf2); 16 17strcat(str1,str2); 18 19system(str1); 20 21fclose(file); 22 23return EXIT_SUCCESS; 24 25}
TKM2977, DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/08/13 01:36

「質問回答サイト」という文字列は問題なく通知表示できます。ソースを提示することは可能ですか?
KENTA2015

2017/08/13 01:38

回答ありがとうございます! ソース載せてみます
KENTA2015

2017/08/13 01:49

ちなみに質問の中では例えで出したこの文字列「質問回答サイト」ですが、今試しにやってみたら「質問回答サイチE」と通知されました
guest

回答1

0

ベストアンサー

結論からいえば可能ですが、messageデータの渡し方を変える必要があります。

Windowsコマンドライン版curlではutf-8データをコマンドライン経由で渡すことは困難のようです。
よって-d @"file.txt"のようにファイル経由でutf-8データを渡します。
また、-d @"file.txt"のファイルパス内にはディレクトリを含めることができないようなので、_chdirでカレントディレクトリを変更する必要があります。

VS2015 Win32コンソールアプリにてexe作成し、Win10上にて正常動作することを確認しました。

test.cpp

C++

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <direct.h> // for _chdir 5 6int main(void) 7{ 8 const char *TOKEN = "xxx.xxx"; 9 const char *URL = "https://notify-api.line.me/api/notify"; 10 11 // POSTデータファイル 12 const char *POST_DIR = "C:\\Users\\hoge\\Desktop\\"; 13 const char *POST_FILE = "form.txt"; 14 15 // Apache SolrのCell (curl) で出るWarning: Couldn’t read data from fileの対処 16 // http://notes.shuntak.net/post/20103925276/apache-solr%E3%81%AEcell-curl-%E3%81%A7%E5%87%BA%E3%82%8Bwarning-couldnt-read 17 // カレントディレクトリをデータファイルのある場所に移動 18 _chdir(POST_DIR); 19 20 // Windowsコマンドラインからcurlで全角文字を送るには 21 // https://discuss.elastic.co/t/windows-curl/49604 22 // 23 // -d : POSTリクエストとしてフォームを送信する。パラメータPARAMは「"value=name"」の形式で指定する 24 // 25 char cCmd[1024] = ""; 26 sprintf( cCmd, "curl -k -X POST -H \"Authorization: Bearer %s\" -d @\"%s\" %s", TOKEN, POST_FILE, URL); 27 int ret = system(cCmd); 28 29 // curl --version 30 // curl 7.52.1 (x86_64-pc-win32) libcurl/7.52.1 WinSSL zlib/1.2.8 31 // Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 32 // Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz 33 34 return ret; 35}

form.txt ※utf-8エンコード

message=質問回答サイト

投稿2017/08/13 06:43

編集2017/08/13 06:47
can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KENTA2015

2017/08/13 08:01

回答ありがとうございます!! テキストファイルを読み込んでっていうとこまではやってたのですが、テキストファイルの中にmessage=を入れるのを忘れてました!! おかげさまで文字化け解消出来ました! ありがとうございました!!
can110

2017/08/13 08:08

自力でほぼ解決されていたようですね(笑 解決でき何よりです。 今回分かったのですが、コマンドラインでcurlを使うのは罠がいくつかあるのでちょっと大変ですね。 こちらも良い勉強になりました。
yumetodo

2017/08/13 08:23 編集

これ自分でWin32APIのCreateProcessからcurl叩いてcurlの標準入力にUTF-8なデータ列を流し込むとかできないんですかね?もちろんどう考えてもファイル作ってしまうのが楽ではあるんですが。
can110

2017/08/13 08:32

試してませんが、もしかしたらUTF-8をバイナリとしてcurlに流せるかもしれません。 ただ、むしろcurl縛りをなくしてWindowsAPI系ならWinInet、WinHTTP、その他HTTP系のオープンソースのライブラリを使うほうが簡単かもしれません。
yumetodo

2017/08/13 08:34

それもそうだ(C++でboost.asioでHTTP通信しつつ)。
can110

2017/08/13 08:39

そもそもC/C++縛りないならもっと簡単です(Pythonとか)^^;
yumetodo

2017/08/13 08:41

おっと、C++の悪口はそこまでだ(はようnetworking標準規格に来い・・・);
can110

2017/08/13 08:50

あ、C/C++大好きですよ~(C99辺りで理解止まってますが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問