【選手権お題その2】この漫画の2コマ目を考えてください

ワイド文字のバイト数を求めたいのですが、文字数しか取得することが出来ません。
ワイド文字のバイト数を取得する事は出来ないのでしょうか?

Visual C++ 2008 Express Edhition の デバックモードで動かしています。

******************************
wchar_t s[256];
s = L"abcあいう";
int len = wcslen(s);
******************************

A 回答 (10件)

#5です。


>UTF-8で読み込んだファイルの中身を半角を1バイト、全角を2バイトとしてバイト数を計算したいのです。

ですから、なんのためにそんな計算がしたいのか、ということです。
そもそも、半角/全角というのはSJIS固有の概念といってもいいです。
なので、SJISに変換するのでない限り、意味の無い計算です。
#細かいことを言うと、unicodeにも、半角/全角という言葉は出てきますが、意味が違います。

UFT-8には、SJISには存在しない文字がありますから、変換してしまうと、情報が落ちてしまいます。それは構わないのでしょうか?
情報が落ちて困るのなら、SJISに変換はできませんし、そうなると、半角/全角といった話も不要です。どうなのでしょうか。

この回答への補足

なんどもありがとうございます。
UTF-8で書かれた1G越えのファイルを開き、中身を取得したいと思っております。
中身が1Gを超えるので一度に展開できず、数回に分けて取得しようと考えております。
1回に取得するサイズを決めて中身を取り出し、次に取得する場合は1回目に取得した次のデータから取得したいのですが、うまくバイト数を取得できずデータが切れてしまっているのが現状です。
その計算に必要なバイトを取得したいと考えております。

補足日時:2008/10/17 15:03
    • good
    • 0

#3です。

補足ありがとうございます。

別枠で質問したのはいい判断だと思います。
しかし、知りたいバイト数とは一体何なのでしょうか。半角文字1バイト、全角文字2バイトだとすると、SJISですか?
開いているファイルはUTF-8ですよね。本当にSJISのバイト数でいいのですか?

また、念のため明記しますが、UTF-8のバイト数とSJISのバイト数は違うものになります。
補足をよろしくお願いします。
    • good
    • 0
この回答へのお礼

返信が遅れ申し訳ありません。
自分の知識不足から自分のやりたい事と質問内容がずれてきているように思えます。
一度整理して改めて質問させていただきます。
ご回答くださいました方々ありがとうございました。

お礼日時:2008/10/20 14:38

> UTF-8で読み込んだファイルの中身を半角を1バイト



UTF-8だと、半角カナは3バイト文字になりますが、それでも1バイトとして数えるのでしょうか?
    • good
    • 1

#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)
{
:
:
}
といった感じで前回の続きから文字を読んでこれます。これではなにか問題があるのでしょうか?
    • good
    • 0

文字列のバイト数なら文字コード関係なしに


int len = strlen(s);
でいいのでは
    • good
    • 0

#4です。


>質問の通りにバイト数を取得したのです。
ワイド文字でのバイト数であれば、
(wcslen(s)+1)*2
です。これ以外はありえません。
全角、半角と言い出した時点ですでにワイド文字の話ではなくなるのです。
なので、「何での」バイト数が必要なのかが肝心なのです。
SJISでのバイト数が必要ならば、MBCSに変換するのが有効ですし、そうでないならば、また別の方法が必要となることでしょう。

この回答への補足

勉強不足ですみません。
UTF-8で読み込んだファイルの中身を半角を1バイト、全角を2バイトとしてバイト数を計算したいのです。
UTF-8のファイルを開くにはワイド文字で取得するしかないようなので、一旦ワイド文字で取得 -> 計算の流れを考えております。
他方法があればご教授ください。

補足日時:2008/10/17 14:15
    • good
    • 0

>バイト数に関してですが、「abcあいう」だった場合は9バイトとしてカウントしたいのです。


>ただ、半角は1バイト、全角は2バイトとして計算したいので、他の方法を考えてみます。
ワイド文字は全角半角かかわらず、一文字2バイトです。
なので、1バイトとして計算したい文字と、2バイトとして計算したい文字とを自分で定義して、自分で計算するしかないですね。

っていうか、そんな自分で計算した値を使って、いったいなにがしたいのでしょうか?
もし、SJISでのバイト数を計算したいのなら、ワイド文字からMBCSに変換するなどしてから、バイト数を数えるほうが確実だと思います。
    • good
    • 0
この回答へのお礼

質問の通りにバイト数を取得したのです。
ご提示していただいた方法だと仰るとおり現実的でなく、且つそれしか方法がないのであれば、既に関数化されていそうですね。
wcstombs()を使用すれば、ワイド文字からマルチバイトへの変換、マルチバイトのバイトすうの取得が出来るようですので、先ずはこちらで試してみます。
ありがとうございました。

お礼日時:2008/10/17 13:17

とりあえずまだ誰も突っ込んでないのでひとつ。


error C2106: '=' : 左のオペランドが、左辺値になっていません。

QNo.4406429
からの続きでしょうか?
だとすれば、ひょっとして知りたいのはUTF-8のときのバイト数でしょうか?
もしそうなら、この質問だけではそんなこと分かりませんので、補足をお願いいたします。
(QNo.4406429の質問を見ていれば分からないこともないですが、検索で表示した場合は意味不明になりますし、質問者の名前を確認しない場合もあります。またページの切れ目で気づかないとかあるので、注意してください)

ところで、ワイド文字についての知識は十分でしょうか?
前回の質問の内容からあてずっぽうでコードを書いていませんか?

この回答への補足

エラーの件失礼しました。
QNo.4406429と同じ質問者です。
一つの枠に2つ以上の質問を書くのも解りづらいと思い別立てで質問させていただきました。

QNo.4406429の事を補足しますと、UTF-8で書かれたファイルをchar型で取得できず、エラーとなるといった質問でした。
こちらに関してはワイド文字列しか取得との回答を頂き解決しております。

ワイド文字に関する知識は充分とはいえない状況です。
自分なりに調べながら質問させていただいております。

補足日時:2008/10/17 09:28
    • good
    • 0

ワイド文字は大抵1文字2バイトです。


いわゆる全角文字・半角文字関係なく。
(サロゲートペアの文字は2バイト*2)

Shift_JIS(=CP932)であるときは、たまたま1バイト文字に半角文字と呼ばれるものが、
2バイト文字に全角文字と呼ばれるものが当てはまっていただけです。

このようなルールでよいのであれば、対象の文字列からShift_JISの1バイト文字以外の文字数分プラスすればいいです。
(Unicode→Shift_JISは情報がおちる可能性があるためやらないほうが無難。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
つまりwcslen() * 2 +1 で計算出来るということですね。
ただ、半角は1バイト、全角は2バイトとして計算したいので、他の方法を考えてみます。

お礼日時:2008/10/17 09:14

単にワイド文字のバイト数を知りたいだけであれば、sizeof(wchar_t)とするだけです。



ワイド文字列のバイト数であれば、バイト数の数え方をまず定義してください。
すなわち、配列のバイト数なのか、ナルワイド文字を含まない文字列を構成するバイト数なのか、ナルワイド文字を含んだ文字列を構成するバイト数なのかです。

この回答への補足

バイト数に関してですが、「abcあいう」だった場合は9バイトとしてカウントしたいのです。

補足日時:2008/10/17 09:06
    • good
    • 0
この回答へのお礼

ありがとうございます。
sizeof(wchar_t)試してみます。

お礼日時:2008/10/17 09:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報