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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

6回答

2819閲覧

文字列の表示の仕組みについて

canvas

総合スコア62

C

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

4クリップ

投稿2016/08/16 06:20

編集2022/01/12 10:55

質問

言語は特に問わないのですが、文字列の表示される仕組みについて知りたいです。

言語は問いませんが、以下はJavaScriptのコードをベースにした説明となります。

JavaScript

1 2var text = "Hello World"; 3 4var charCount = text.length; 5console.log(charCount); //11 6 7var i = 0; 8for (i; i < charCount; i++) { 9 console.log(text[i]); //文字列オブジェクトが内部で持つ配列からHello Worldが1文字ずつ取り出されて出力される 10} 11 12console.log(text); //Hello Worldと一回で表示される

上のコードを確認する限りでは、文字列オブジェクトは内部で1文字単位で保持する配列を持っているようです。

質問としましては、今回の例でいえば「Hello World」というまとまった文字列を出力する際には、
毎回、配列に格納されている文字を連結させてから表示させているのですか?

それとも、文字列オブジェクトの初期化時に1文字単位で配列に格納するのとは別に、まとまった文字列をプライベートプロパティーに格納していて、まとまった文字列を表示させる際には、後者のプライベートプロパティーの値を出力しているのですか?
他にも取り得る方法があるのでしょうか?

推測でも良いので回答頂けると非常に嬉しいです。よろしくお願いいたします。

追記

JavaScript

1var text = "Hello World"; 2text[0] = "M" 3console.log(text) //"Mellow World"にはならず、"Hello World"のまま 4 5var replacedText = text.replace("H", "M"); 6 7console.log(text); //Hello Worldのまま 8console.log(replacedText); //Mello Worldに置換された文字列

ちなみに、文字列オブジェクトはイミュータブルで、文字列に変更を加える場合は新しい文字列オブジェクトを生成して返すようです。

DrqYuto👍を押しています

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

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

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

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

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

cateye

2016/08/23 21:31

>文字列の表示される仕組み・・・ 文字を出力するにもアプリケーション、OS、ドライバ、ハードウエア(モニタなど)の階層があります。(プログラムを提示していらっしゃるのでアプリケーションだと思いますが)もう少し、的を絞った方が回答がしやすくなります。
guest

回答6

0

C言語は確かString型という軟弱なものはなく、
Char型の配列を作ってポインターがどうの、要素数がどうのという血の滲むような作業をしたと聞いています。
参考書でチラッと見知っただけなので今はどうなってるか知りません。

その名残かどうかはわかりませんが、
JavaScriptやPHPのString型は少々配列に似たような挙動をします。
少々似ているだけで、Array型とは全く関係ないのです。

JavaScript

1> "hogehoge".length 28 3> "hogehoge".map 4undefined 5 6> [0, 1].length 72 8 9> [0, 1].map 10function map() { [native code] }

JavaScriptはString型の中身はUTF-16で持つようにECMAスクリプトで定義されているらしく、
日本語を含む文字列も1文字とカウントするようです。

JavaScript

1> "あいうえお"[2] 2"う"

PHPはそういう事はなく、単純にバイトで持っているので日本語を含む文字列に対して配列的なアクセスを行うと見事に化けます。
ASCII値は問題なし。

PHP

1// PHP5.6 + psyshを使いました。 2>>> $hoge = "あいうえお" 3=> "あいうえお" 4 5>>> $hoge[2] 6=> b"‚" 7 8>>> $piko = "aiueo" 9=> "aiueo" 10 11>>> $piko[2] 12=> "u"

まとめ

  • C言語の文字列の扱いでエンジニア達大苦戦
  • Java・C++「String型作ったよ!」
  • 後発の言語「JavaやC++を見習おう!」 ※ただし実装は言語やコンパイルによって違う

単純にこんな感じだろうと思います。

投稿2016/08/16 11:50

miyabi-sun

総合スコア21158

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

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

0

内部的な表現は、どのエンコードを用いるかは言語やコンパイルオプションによって異なると思います。表示ということであれば、内部エンコードと表示用エンコードが違う場合、そこで変換が発生します。

投稿2016/08/16 06:54

Zuishin

総合スコア28656

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

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

Zuishin

2016/08/16 08:26 編集

例えば Perl http://hachiojipm.github.io/entry/2013-10-01-encoding.html 内部は UTF8 です。 C は基本的に ASCII、コンパイルオプションによって UTF16 C# は UTF16 です。 コンソールにはデフォルトエンコードがあり、内部エンコードと違う場合には変換しなければなりません。テキストを扱うストリームオブジェクトなど、自動的に変換する仕組みが用意されている言語があります。
guest

0

毎回、配列に格納されている文字を連結させてから表示させているのですか?

いろんな言語があるので言語によるのかなという気もしますが、配列が連続したバイト列だとすると出力時に連結する必用はなく、最初から連結されてると考えられます。

連続したバイト列を文字列として扱うには、2通りあるかなと思います。

  1. 配列の先頭から終端文字が出現するまでを文字列とする(C/C++)
  2. 連続したバイト列の長さをプロパティとして持つ (C++/Java/Etc..)

前者はC言語の標準ライブラリでそういう仕様の関数が多くあります。
後者はいわゆるString型のことでライブラリのソースを見れば仕様がわかると思います。
C++はC言語を踏襲しつつオブジェクト型としてStringがあるので両方の特徴があります。

例えば java.lang.String のソースを見ると3つのプロパティで文字列を表現してるのが見て取れます。

Java

1 /** The value is used for character storage. */ 2 private final char value[]; 3 4 /** The offset is the first index of the storage that is used. */ 5 private final int offset; 6 7 /** The count is the number of characters in the String. */ 8 private final int count; 9

他の言語は分かりませんが、探せばStringのソースが出て来ると思うので検索してみるのをオススメします。

最終的にはOSが用意しているシステムコールやAPIを使って出力すると思いますので処理系によっても違うかも。です。

投稿2016/08/23 05:09

編集2016/08/23 10:40
take88

総合スコア1351

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

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

0

的を外していたらごめんなさい。

どんな言語でもそうだと思いますが、最終的には表示したい文字列を含んだ巨大なビットマップが作られます。その巨大なビットマップは各ピクセルの色の塊で、XGAなら1024×768のデータです。1ピクセルは32bitで、色を示しています。これがそのまま、LCDコントローラと呼ばれるハードウェアに転送され、表示されます。

つまり、「Hello World」という文字列は通常はあるウィンドウ内に「文字列」としてデータがありますが、文字列は文字コードの列なので、その文字コードからフォントデータを取り出してビットマップに変換され、他の表示(画面内の全てをビットマップに変換したもの)と合わせて表示しています。

投稿2016/08/16 08:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

質問としましては、今回の例でいえば「Hello World」というまとまった文字列を出力する際には、
毎回、配列に格納されている文字を連結させてから表示させているのですか?

それとも、文字列オブジェクトの初期化時に1文字単位で配列に格納するのとは別に、まとまった文字列をプライベートプロパティーに格納していて、まとまった文字列を表示させる際には、後者のプライベートプロパティーの値を出力しているのですか?

後者で実装している言語処理系はほぼ存在しないと思われますので、この質問に対する回答は前者になると思います。しかし、質問の内容を見る限り、まずは、言語処理系におけるデータ型という概念をしっかり身につけられたほうが良いように思います。

連想して質問されること

文字列がその言語処理系の文字型のオブジェクトの配列で実装されているかいなかというと、言語処理系によって異なります。ただ、最近の言語処理系の流行としては文字列型は文字列を格納する専用のデータ型で、文字型オブジェクトの配列ではないもののほうが多いと思います。

注意したほうが良いこと

最近の言語処理系では、文字列型はバイト型の配列ではありません。昔は、たとえばC言語では、文字列型というデータ型は存在せず、常にバイト型の配列に格納していました。そして、プログラマが文字のエンコーディングを意識して、内部的に Shift-JIS で保持しているものを UTF-8 に変換して出力するなどということをしておりましたが、最近の言語処理系では、文字列は文字列型のオブジェクトになっており、そのエンコーディングを意識せずに扱えるようになっています。そして、入出力の時にエンコーディングを指定したり、自動的に変換されたりします。そのあたりは、 Java の String 型がきれいです。

投稿2016/08/26 06:40

編集2016/08/26 06:46
mit0223

総合スコア3401

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

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

0

上のコードを確認する限りでは、文字列オブジェクトは
内部で1文字単位で保持する配列を持っているようです。

あなたは、Stringも配列も
・lengthプロパティを持っている
・「[]」でアクセスできる
この点が共通しているのだから、同じオブジェクトに違いない
というお考えだということですよね。その考えが間違っています。

その点が共通しているだけで別のオブジェクトです。

投稿2016/08/24 23:24

miu_ras

総合スコア902

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問