アカウント名:
パスワード:
こういう問題は授業で定義してる前提条件があるから、授業の外での定義を当てはめてはいけない。(1)だってそう。「情報の最小単位を何といいますか」。「情報」ってなんだよwとなる。
C 言語や Python の実習で strlen や len すれば間違っていると速攻でバレるんだけど、なんて説明するんだ?・・・馬鹿だろ
何を言いたいんだろう・・・
ちなみにlenとstrlenどっちも同じ文字数を返す関数だけど、pythonのlen("abcあいう")は6を返す。全角も半角も「1」cのstrlen("abcあいう")は9を返す。半角は「1」、全角は「2」文字エンコードという前提条件が違うから結果も変わる。
cのstrlen("abcあいう")は9を返す。半角は「1」、全角は「2」文字エンコードという前提条件が違うから結果も変わる。
C11以降のUTF8な処理系なら12だよ。strlenはあくまでバイト数を返す。全角とか半角の区別などない。
リテラル文字列がUTF8認識されるの?うそだろ。そんなの不具合の元じゃん。やめろよ
コンパイラにとって文字列リテラルのエンコーディング指定は「その文字列をどのようなバイナリ列に変換して格納するか」を左右するだけで「認識」なんて一切しない。utf8な文字列リテラルの型はchar*またはchar[]で、「認識」は文字列関数などのライブラリの責任。エンコーディングによる不具合を恐れるならそのあたりの仕様をきちんと理解するか、ASCII文字以外を扱わないようにした方がいいよ。
プレフィクス無の通常(?)リテラルは、ネイティブナローエンコードで、それは環境依存。Windowsでcp932を使うなら9だろうし、Ubuntuならutf8が使われるだろうから12だろう。
C++11移行、u8プレフィクス(とu/Uプレフィクス)が新設され、例えば、strlen(u8"abcあいう")と書けば、UTF8でエンコーディングされて12になる。
# そして、無視されるザロゲートペア
VC2022だとソースコードがUTF8でもシフトJISとして扱われる。ソースコードを自動でUTF8に変換する機能もあるし、過去のソースとの互換性問題もあるから、そういうものという認識で使ってたけど冷静になって考えてみるととんでも仕様だな。
ソースファイルのエンコーディングと、コンパイル後のオブジェクトファイルに文字列リテラルを埋め込む際のエンコーディング、異なるものを選べることはとんでも仕様とは思えないけど。
たとえばgccだと--input-charsetと--exec-charsetでそれぞれ選べる。
数十年後には負の遺産になりそう今後の世代にさんざ叩かれるんだろうなー
その点では、別に元の話の挙動もVC2022で始まったことではなく、それ以前のバージョンからそうだった。いま軽くググったら、VC2005でBOM無しUTF-8のソースファイルでエラーになるという話が出てきたから、たぶんVC2005からの挙動ではないだろうか。
VC2022かその少し前での変化といえば、gccみたいな/source-charsetや/execution-charsetコマンドラインオプションが増えたことかな。それ以前はオプションでは選べなくて、おそらくコンパイル時のWindowsの言語によって決まっていたのだと思われる。
全部UTF-8にするには/utf-8オプション(なお/source-charset:utf-8 /execution-charset:utf-8と指定することとと同じとドキュメントに書いてある)を指定したり、#4279029に書いてあるu8プレフィックスで個別にUTF-8文字列リテラルにしたりという方法となる。
MSVCは以前から #pragma execution_character_set を使えば実行時の文字コードを指定できましたよ。ただ、pragma の書かれたソースコードだけに有効なので、混在するとひどい目に遭いますが。
Pythonだとデフォルトエンコーディングがutf-8なのでバイト数出すなら下記のような感じでしょうかね。
len("ABC".encode()) # 3len("電話".encode()) # 6len("📞電話".encode()) # 10len("𪗱𪘚".encode()) # 8
技術の授業に対してこの問題が出されてるんだから、授業で習った内容が回答でしょう。それに対して定義により答えがいろいろあるって言われても、おまえ何言ってんの? にしかならない中学の授業だから基礎知識の勉強だと思うけど、文字コード等や組版の知識があったところで、授業の内容は変わらんよね?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり
前提条件がある (スコア:1)
こういう問題は授業で定義してる前提条件があるから、授業の外での定義を当てはめてはいけない。
(1)だってそう。「情報の最小単位を何といいますか」。「情報」ってなんだよwとなる。
Re: (スコア:0)
C 言語や Python の実習で strlen や len すれば
間違っていると速攻でバレるんだけど、なんて説明するんだ?
・・・馬鹿だろ
Re: (スコア:0)
何を言いたいんだろう・・・
ちなみにlenとstrlenどっちも同じ文字数を返す関数だけど、
pythonのlen("abcあいう")は6を返す。全角も半角も「1」
cのstrlen("abcあいう")は9を返す。半角は「1」、全角は「2」
文字エンコードという前提条件が違うから結果も変わる。
Re: (スコア:0)
cのstrlen("abcあいう")は9を返す。半角は「1」、全角は「2」
文字エンコードという前提条件が違うから結果も変わる。
C11以降のUTF8な処理系なら12だよ。
strlenはあくまでバイト数を返す。全角とか半角の区別などない。
Re: (スコア:0)
リテラル文字列がUTF8認識されるの?うそだろ。そんなの不具合の元じゃん。やめろよ
Re: (スコア:0)
コンパイラにとって文字列リテラルのエンコーディング指定は「その文字列をどのようなバイナリ列に変換して格納するか」を左右するだけで「認識」なんて一切しない。
utf8な文字列リテラルの型はchar*またはchar[]で、「認識」は文字列関数などのライブラリの責任。
エンコーディングによる不具合を恐れるならそのあたりの仕様をきちんと理解するか、ASCII文字以外を扱わないようにした方がいいよ。
Re: (スコア:0)
プレフィクス無の通常(?)リテラルは、ネイティブナローエンコードで、
それは環境依存。Windowsでcp932を使うなら9だろうし、
Ubuntuならutf8が使われるだろうから12だろう。
C++11移行、u8プレフィクス(とu/Uプレフィクス)が新設され、
例えば、strlen(u8"abcあいう")と書けば、UTF8でエンコーディングされて12になる。
# そして、無視されるザロゲートペア
Re: (スコア:0)
VC2022だとソースコードがUTF8でもシフトJISとして扱われる。
ソースコードを自動でUTF8に変換する機能もあるし、過去のソースとの互換性問題もあるから、そういうものという認識で使ってたけど冷静になって考えてみるととんでも仕様だな。
Re: (スコア:0)
ソースファイルのエンコーディングと、コンパイル後のオブジェクトファイルに文字列リテラルを埋め込む際のエンコーディング、異なるものを選べることはとんでも仕様とは思えないけど。
たとえばgccだと--input-charsetと--exec-charsetでそれぞれ選べる。
Re: (スコア:0)
数十年後には負の遺産になりそう
今後の世代にさんざ叩かれるんだろうなー
Re: (スコア:0)
その点では、別に元の話の挙動もVC2022で始まったことではなく、それ以前のバージョンからそうだった。いま軽くググったら、VC2005でBOM無しUTF-8のソースファイルでエラーになるという話が出てきたから、たぶんVC2005からの挙動ではないだろうか。
VC2022かその少し前での変化といえば、gccみたいな/source-charsetや/execution-charsetコマンドラインオプションが増えたことかな。それ以前はオプションでは選べなくて、おそらくコンパイル時のWindowsの言語によって決まっていたのだと思われる。
全部UTF-8にするには/utf-8オプション(なお/source-charset:utf-8 /execution-charset:utf-8と指定することとと同じとドキュメントに書いてある)を指定したり、#4279029に書いてあるu8プレフィックスで個別にUTF-8文字列リテラルにしたりという方法となる。
Re: (スコア:0)
MSVCは以前から #pragma execution_character_set を使えば実行時の文字コードを指定できましたよ。
ただ、pragma の書かれたソースコードだけに有効なので、混在するとひどい目に遭いますが。
Re: (スコア:0)
Pythonだとデフォルトエンコーディングがutf-8なので
バイト数出すなら下記のような感じでしょうかね。
len("ABC".encode()) # 3
len("電話".encode()) # 6
len("📞電話".encode()) # 10
len("𪗱𪘚".encode()) # 8
Re: (スコア:0)
技術の授業に対してこの問題が出されてるんだから、授業で習った内容が回答でしょう。
それに対して定義により答えがいろいろあるって言われても、おまえ何言ってんの? にしかならない
中学の授業だから基礎知識の勉強だと思うけど、文字コード等や組版の知識があったところで、授業の内容は変わらんよね?