No.6ベストアンサー
- 回答日時:
#5です。
>UTF-8で読み込んだファイルの中身を半角を1バイト、全角を2バイトとしてバイト数を計算したいのです。
ですから、なんのためにそんな計算がしたいのか、ということです。
そもそも、半角/全角というのはSJIS固有の概念といってもいいです。
なので、SJISに変換するのでない限り、意味の無い計算です。
#細かいことを言うと、unicodeにも、半角/全角という言葉は出てきますが、意味が違います。
UFT-8には、SJISには存在しない文字がありますから、変換してしまうと、情報が落ちてしまいます。それは構わないのでしょうか?
情報が落ちて困るのなら、SJISに変換はできませんし、そうなると、半角/全角といった話も不要です。どうなのでしょうか。
この回答への補足
なんどもありがとうございます。
UTF-8で書かれた1G越えのファイルを開き、中身を取得したいと思っております。
中身が1Gを超えるので一度に展開できず、数回に分けて取得しようと考えております。
1回に取得するサイズを決めて中身を取り出し、次に取得する場合は1回目に取得した次のデータから取得したいのですが、うまくバイト数を取得できずデータが切れてしまっているのが現状です。
その計算に必要なバイトを取得したいと考えております。
No.10
- 回答日時:
#3です。
補足ありがとうございます。別枠で質問したのはいい判断だと思います。
しかし、知りたいバイト数とは一体何なのでしょうか。半角文字1バイト、全角文字2バイトだとすると、SJISですか?
開いているファイルはUTF-8ですよね。本当にSJISのバイト数でいいのですか?
また、念のため明記しますが、UTF-8のバイト数とSJISのバイト数は違うものになります。
補足をよろしくお願いします。
返信が遅れ申し訳ありません。
自分の知識不足から自分のやりたい事と質問内容がずれてきているように思えます。
一度整理して改めて質問させていただきます。
ご回答くださいました方々ありがとうございました。
No.8
- 回答日時:
#6です。
>http://okwave.jp/qa4406429.html
こちらの質問の続きだとしますと、
FILE *file1;
wchar_t s[256];
file1 = fopen( "C:\\readme", "r, ccs=UTF-8");
while (fgetws(s, 256, file1) != NULL)
{
:
:
}
といった感じで前回の続きから文字を読んでこれます。これではなにか問題があるのでしょうか?
No.5
- 回答日時:
#4です。
>質問の通りにバイト数を取得したのです。
ワイド文字でのバイト数であれば、
(wcslen(s)+1)*2
です。これ以外はありえません。
全角、半角と言い出した時点ですでにワイド文字の話ではなくなるのです。
なので、「何での」バイト数が必要なのかが肝心なのです。
SJISでのバイト数が必要ならば、MBCSに変換するのが有効ですし、そうでないならば、また別の方法が必要となることでしょう。
この回答への補足
勉強不足ですみません。
UTF-8で読み込んだファイルの中身を半角を1バイト、全角を2バイトとしてバイト数を計算したいのです。
UTF-8のファイルを開くにはワイド文字で取得するしかないようなので、一旦ワイド文字で取得 -> 計算の流れを考えております。
他方法があればご教授ください。
No.4
- 回答日時:
>バイト数に関してですが、「abcあいう」だった場合は9バイトとしてカウントしたいのです。
>ただ、半角は1バイト、全角は2バイトとして計算したいので、他の方法を考えてみます。
ワイド文字は全角半角かかわらず、一文字2バイトです。
なので、1バイトとして計算したい文字と、2バイトとして計算したい文字とを自分で定義して、自分で計算するしかないですね。
っていうか、そんな自分で計算した値を使って、いったいなにがしたいのでしょうか?
もし、SJISでのバイト数を計算したいのなら、ワイド文字からMBCSに変換するなどしてから、バイト数を数えるほうが確実だと思います。
質問の通りにバイト数を取得したのです。
ご提示していただいた方法だと仰るとおり現実的でなく、且つそれしか方法がないのであれば、既に関数化されていそうですね。
wcstombs()を使用すれば、ワイド文字からマルチバイトへの変換、マルチバイトのバイトすうの取得が出来るようですので、先ずはこちらで試してみます。
ありがとうございました。
No.3
- 回答日時:
とりあえずまだ誰も突っ込んでないのでひとつ。
error C2106: '=' : 左のオペランドが、左辺値になっていません。
QNo.4406429
からの続きでしょうか?
だとすれば、ひょっとして知りたいのはUTF-8のときのバイト数でしょうか?
もしそうなら、この質問だけではそんなこと分かりませんので、補足をお願いいたします。
(QNo.4406429の質問を見ていれば分からないこともないですが、検索で表示した場合は意味不明になりますし、質問者の名前を確認しない場合もあります。またページの切れ目で気づかないとかあるので、注意してください)
ところで、ワイド文字についての知識は十分でしょうか?
前回の質問の内容からあてずっぽうでコードを書いていませんか?
この回答への補足
エラーの件失礼しました。
QNo.4406429と同じ質問者です。
一つの枠に2つ以上の質問を書くのも解りづらいと思い別立てで質問させていただきました。
QNo.4406429の事を補足しますと、UTF-8で書かれたファイルをchar型で取得できず、エラーとなるといった質問でした。
こちらに関してはワイド文字列しか取得との回答を頂き解決しております。
ワイド文字に関する知識は充分とはいえない状況です。
自分なりに調べながら質問させていただいております。
No.2
- 回答日時:
ワイド文字は大抵1文字2バイトです。
いわゆる全角文字・半角文字関係なく。
(サロゲートペアの文字は2バイト*2)
Shift_JIS(=CP932)であるときは、たまたま1バイト文字に半角文字と呼ばれるものが、
2バイト文字に全角文字と呼ばれるものが当てはまっていただけです。
このようなルールでよいのであれば、対象の文字列からShift_JISの1バイト文字以外の文字数分プラスすればいいです。
(Unicode→Shift_JISは情報がおちる可能性があるためやらないほうが無難。)
ありがとうございます。
つまりwcslen() * 2 +1 で計算出来るということですね。
ただ、半角は1バイト、全角は2バイトとして計算したいので、他の方法を考えてみます。
No.1
- 回答日時:
単にワイド文字のバイト数を知りたいだけであれば、sizeof(wchar_t)とするだけです。
ワイド文字列のバイト数であれば、バイト数の数え方をまず定義してください。
すなわち、配列のバイト数なのか、ナルワイド文字を含まない文字列を構成するバイト数なのか、ナルワイド文字を含んだ文字列を構成するバイト数なのかです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- Excel(エクセル) LEFT関数で文字数を指定しないで取りだす方法 7 2023/06/30 09:49
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) 【Excel】複数列ごとに取得するセルを変更したい 2 2023/03/23 21:04
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
【お題】 ・ありそうだけど、絶対に無いことわざを教えてください。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
冬の健康法を教えて!
温度変化が大きくなり、風邪をひきやすいこれからの季節。 どんなことに気をつけていますか?
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
エディットボックスの入力制限について
C言語・C++・C#
-
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
-
4
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
SQLで1バイト、2バイト混在...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
GetWindowTextでアドレスバーか...
-
変数 および ポインタのサイ...
-
pythonでバイナリデータを配列...
-
1バイト文字から2バイト文字に変換
-
【VB2005】テキストボックス内...
-
文字数を取得したい
-
:(コロン)のKeyCode
-
ピクセル,dpiから容量(バイト...
-
javaでアップロード時、SJIS文...
-
0.5バイトづつ読み込みたいので...
-
バイト列とバイナリ列の違いが...
-
VB.NET LeftBの代用
-
バイナリとBCDコード
-
Visual Basicでパック10進(2進...
-
「1TB」のHDDに日本語は何字入...
-
char str[256]の256の意味は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
C++ Builderで文字列をバイトに...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
GetWindowTextでアドレスバーか...
-
ピクセル,dpiから容量(バイト...
-
【VB2005】テキストボックス内...
-
URLは最高何文字まで可能なので...
-
64bit対応
-
UCS-2の一覧表が欲しい
-
VBAでUnicodeしか存在しない文...
-
SQLで1バイト、2バイト混在...
-
ビットスワップとバイトスワッ...
-
CRC計算方法
おすすめ情報