Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(string): 文字列の分解と結合 #187

Merged
merged 8 commits into from
Feb 22, 2017
Merged

feat(string): 文字列の分解と結合 #187

merged 8 commits into from
Feb 22, 2017

Conversation

azu
Copy link
Collaborator

@azu azu commented Feb 18, 2017

#121

  • String#split
  • Array#join
  • 正規表現で区切る
  • 空文字を引数に取った場合はcode unitで区切る
  • 文字で区切りたい場合はIteratorかspreadする

@azu azu changed the title feat(string): 文字列の分解と結合 [WIP] feat(string): 文字列の分解と結合 Feb 18, 2017
この2つを合わせれば、区切り文字を`、`から`,`へ変換する処理を次のように書くことができます。

```js
var string = "赤、青、緑".split("、").join(",");
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

split joinは典型的な使い方だと思うのでセットにした。
もう少し見た目的に分かりやすい例があると良さそう?
, 似てて分かりにくいかも

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

var string = "赤・青・緑".split("・").join(",");

ではどうだろうか

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

たしかに良さそうですね。
ありがとうございます

JavaScriptにおいて、メソッド名に`CodePoint`が含まれているものやIteratorを扱うもの**以外**は、すべてCode Unit単位で扱われます。
つまり、`split`メソッドもCode Unit単位で文字列を分解しています。

次のコードを見ると、`split("")`は**文字**単位で分解するのではなく、**Code Unit**単位で分解していることが分かります。
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

単位ってことばUnitと被るのでよくなさそう。

Code Unitごとに?かな

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C++11: Syntax and Feature#basic.fundamental
だと

wchar_t型のひとつのオブジェクトは、実装がサポートするロケールの文字セットの任意の一文字を表現できる。

wchar_tは、少なくとも、規格上はそうなっている。しかし、現実的には、そのような固定長の文字コードは、サポートするロケールと文字セットを大幅に限定しなければ、存在しない。たとえば、ある実装では、wchar_tは16bitのUTF-16の1単位を表現するようになっている。しかし、UTF-16の1単位は、Unicodeの文字セットの任意の一文字を表現できない。ある実装では32bitのUTF-32の1単位を表現するようになっているが、UTF-32も、1単位で任意の1文字を表せる文字のエンコード方式ではない。

ともうすこしあっさりした表現を使っていますね。

console.log(strings); // => ["a", "b", "c", "d"]
```

### `String#split`と空文字
Copy link
Collaborator Author

@azu azu Feb 19, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここは、この章の最初に 文字列、文字、Code Unit、Code Pointの説明を簡単にいれるので、それ前提となってる。

以下はまだちゃんと書いてない。(おおまかな概念分けはこのぐらいでやりたい感じ。あとは参考文献を調査して言葉を揃える)


文字列

"文字"からなる順序を持った集合。
JavaScriptでは文字列リテラルで表現できる。

"文字列"

文字

  • 文字列を構成する要素
  • 視覚的に認識している"文字"
  • (UnicodeにおいてはAbstract characterだけど、概念が難しいので言葉は出さない)

["文", "字", "列"]


Unicode

ECMAScriptでは文字の表現にUnicodeを採用し、
文字のエンコーディングにUTF-16を採用している。

Code Point

それぞれの文字に対して割り当てられた数値のこと
(この数値を決めているのがUnicode)

ES2015からは \u{12345} でCode Pointを文字列リテラルに書くことができる。

[ 25991, 23383, 21015 ]

Code Unit

UTF-16でエンコードされたbitのシーケンス。
JavaScriptでは、文字列を内部的にCode Unitで扱う。

Code Unitは16bitの範囲しか表現できないため、
1つのCode Pointを1つのCode Unitで表現できない場合がある。
これはサロゲートペアと呼ばれ、high-suroogate code unitとlow-surrogate code unitの2つのcode unitで、1つのCode Pointを表現する。

Code Pointも文字列リテラルに "\u1234" のようにしてかくことができる。

JavaScriptでは基本的に文字列はCode Unitごとに扱う。
次の2つは例外として、Code Pointごとに扱う。

  • Iterator
  • メソッドにCodePointという名前を含むもの

Combining character

省く

文字数

JavaScriptにおいてString#lengthはその文字列を構成するCode Unitの個数を返す。
そのため、3文字に見えていても、lengthは3以上(Code Unitが3つ以上)の場合があります。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Combining character

省く

あっ・・・。
まあ書き出せば長くなりそうだしやむを得ないかな・・・?

@azu azu changed the title [WIP] feat(string): 文字列の分解と結合 feat(string): 文字列の分解と結合 Feb 22, 2017
@azu azu merged commit d8fe58b into master Feb 22, 2017
@azu azu deleted the string-split-join branch February 22, 2017 10:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants