/
313.txt
1426 lines (1146 loc) · 54.1 KB
/
313.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[20] [DFN[[RUBYB[結合文字]@en[combining character]]]]は、直前の[[基底文字]]と合成されて表示される[[文字]]です。
* 仕様書
[REFS[
- [142] [CITE[The Unicode Standard, Version 13.0 - ch02.pdf]], [TIME[2020-03-09T17:53:32.000Z]], [TIME[2020-12-06T08:54:12.180Z]]
<https://www.unicode.org/versions/latest/ch02.pdf#G1708>
- [9] [CITE[[[The Unicode Standard]], Version 12.0 - ch03.pdf]] ([TIME[2019-03-02 07:15:30 +09:00]]) <http://www.unicode.org/versions/latest/ch03.pdf#G30602>
-- [30] D53
-- [38] D54
-- [39] D55
-- [45] D56
-- [47] D56a
-- [49] D57
-- [115] [CSECTION[Application of Combining Marks]]
<https://www.unicode.org/versions/latest/ch03.pdf#G50030>
- [164] [CITE[The Unicode Standard, Version 13.0 - ch07.pdf]], [TIME[2020-03-09T17:53:38.000Z]], [TIME[2020-12-07T09:15:13.901Z]] <https://www.unicode.org/versions/latest/ch07.pdf#M9.37081.HeadingBreak.79.Combining.Marks>
- [18] [CITE@en-us[Glossary]] ([TIME[2014-12-06 10:49:08 +09:00]] 版) <https://unicode.org/glossary/#combining_mark>
- [53] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T06:24:49.510Z]] <https://www.unicode.org/reports/tr44/#Default_Values_Table>
- [103] [CITE@en-us[[[UAX #44]]: Unicode Character Database]] ([TIME[2016-06-21 02:42:04 +09:00]]) <https://www.unicode.org/reports/tr44/#General_Category_Values>
- [54] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T08:24:32.981Z]] <https://www.unicode.org/reports/tr44/#Derived_Extracted>
-[55] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T08:37:23.285Z]] <https://www.unicode.org/reports/tr44/#Canonical_Combining_Class_Values>
- [56] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T08:49:23.551Z]] <https://www.unicode.org/reports/tr44/#Property_Invariants>
- [101] [CITE@en-us[[[UTS #46]]: Unicode IDNA Compatibility Processing]] ([TIME[2016-06-02 03:53:22 +09:00]]) <https://www.unicode.org/reports/tr46/#Validity_Criteria>
- [57] [CITE@en-us[UAX #44: Unicode Character Database]], [TIME[2020-03-06T22:23:11.000Z]], [TIME[2020-10-21T08:53:55.034Z]] <https://www.unicode.org/reports/tr44/#Invariants_in_Implementations>
]REFS]
[116]
[[結合文字]]の[[適用]]については、
[CITE[The Unicode Standard]]
は[[規定]]と[DFN[[RUBYB[[[指針]]][guideline]]]]を示しています。
特に[[文字のレンダリング]]に関する指針については、
[[レンダリング]]について特に情報が与えられない場合の既定のレンダリングの挙動を示すものとされています。
個々の文字について [[typograph]] 的な慣習がある場合には、
適宜それを使って最適な[[レンダリング]]を実現することが期待されています。
[SRC[>>115]]
[141]
[[文字]]の扱いは文化と慣習に依存した部分が大きく、
[[フォント]]や[[レンダリングシステム][文字のレンダリング]]の影響も大きいので、
厳密に[[規定]]することには困難が多いのでしょう。
それにしても曖昧な規則が多く、
こんなので[[相互運用性]]は保てるのか疑問に思ってしまいますが、
実際[[相互運用性]]はかなり低いと言わざるを得ません。
違うシステムで[[レンダリング]]が違うのは当たり前で、
同じシステムでもインストールされている[[フォント]]の違い程度の些細な要因で違って表示されることがよくあるのが現状です。
* 結合文字とその分類
[10] [DFN[[RUBYB[結合文字]@en[combining character]]]] =
[DFN[[RUBYB[結合マーク]@en[combining mark]]]]は、
[CODE[General_Category]] が
[DFN[Combining Mark]] ([DFN[[CODE[Mark]]]], [DFN[[CODE[M]]]]) の[[文字]]
([[符号位置]])
です。
[SRC[>>9, >>101, >>18]]
[12] [[私用文字]] ([CODE[[[Co]]]]) を[[結合文字]]と解釈するか否かは、
[[実装]]によります [SRC[>>9]]。
原則は[[基底文字]]扱いとされています。
[SEE[ [[基底文字]] ]]
[143]
[[結合文字]]は、
[[関連付けられた基底文字]]に対して相対的に決まる位置に表示される[[文字]]です
[SRC[>>142]]。
[150]
具体的には、
[[アルファベット]]系文字などに対する[[ダイアクリティカルマーク]]、
[[アラビア文字]]の [[harakat]]、
[[デバナガリ文字]]の [[matra]]、
[[仮名]]の[[濁点]]・[[半濁点]]、
[[記号用ダイアクリティカルマーク][symbol diacritic]]、
[[囲み文字]]を作るための[[外枠文字]]などが[[結合文字]]として用意されています。
[REFS[
- [23] [[結合文字]]の一覧 ([[結合文字]]と解釈する [CODE[Co]] を除く)
<https://chars.suikawiki.org/set/%24unicode%3Acombining-character>
- [31] [CODE[[[General_Category]]=[[M][Mark]]]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3AMark>
]REFS]
[144] [[結合文字]]には、
[[非前進マーク]]と[[前進マーク]]があります。
[SRC[>>142]]
- [24] [DFN[[RUBYB[非前進マーク][nonspacing mark]]]]は、
[[General Category]]
が
[[Nonspacing Mark]] ([DFN[[CODE[Mn][Nonspacing Mark]]]])
か
[[Enclosing Mark]] ([DFN[[CODE[Me][Enclosing Mark]]]])
の[[結合文字]]です。
[SRC[>>30]]
--
[29]
[DFN[[RUBYB[囲みマーク][enclosing mark]]]]は、
[[非前進マーク]]であって
[[General Category]]
が
[[Enclosing Mark]] ([DFN[[CODE[Me][Enclosing Mark]]]])
であるものです。
[[囲みマーク]]は、
[[非前進マーク]]の[[部分クラス]]であって、
[[基底文字]]の上中下に配置するのではなく、囲むものです。
[SRC[>>38]]
--
[145]
[[非前進マーク]]は、
それ自体で表示上の位置 (spacing position)
を占有しません [SRC[>>142]]。
[[基線]]上を先へと進み (baseline advance) ません
[SRC[>>164]]。
ただし[[基底文字]]が単独の場合と、
[[基底文字]]と[[非前進マーク]]との組合せの場合とで文字幅 (advance width)
が変わってくることはあります
[SRC[>>142]]。
-
[40]
[DFN[[RUBYB[前進マーク][spacing mark]]]]は、
[[結合文字]]であって[[非前進マーク]]ではないものです。
[SRC[>>39]]
--
[165]
[[前進マーク]]は通常の文字のような挙動を示し [SRC[>>164]]、
それ自体の幅を占有します。
他の文字と複雑に作用することがあります [SRC[>>164]]。
;; [166]
[[Unicode]] 以前の[[文字コード]]で[[結合文字]]に相当するものは[[非spacing文字]]などと言っていました。
しかし [[Unicode]] の[[結合文字]]には [[spacing]] な文字も[[非spacing]]
な文字もあるのです。
[113] この分類は[[書記素クラスター]]の定義に関わってきます。
[26]
[CODE[General_Category]] の値
[CODE[Mark]] = [CODE[M]]
は、
[[Spacing Combining Mark]] ([CODE[[[Mc]]]]),
[[Nonspacing Mark]] ([CODE[[[Mn]]]]),
[[Enclosing Mark]] ([CODE[[[Me]]]])
のいずれかであることを表します。
[SRC[>>9, >>103]]
[REFS[
- [44] [[nonspacing mark]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3Anonspacing-mark>
- [43] [[enclosing mark]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3Aenclosing-mark>
- [109] [[spacing mark]] の一覧 ([[結合文字]]と解釈する [CODE[Co]] を除く)
<https://chars.suikawiki.org/set/%24unicode%3Aspacing-mark>
- [110] [CODE[[[General_Category]]=[[Mn]]]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3AMn>
- [111] [CODE[[[General_Category]]=[[Me]]]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3AMe>
- [112] [CODE[[[General_Category]]=[[Mc]]]] の一覧
<https://chars.suikawiki.org/set/%24unicode%3AMc>
]REFS]
* 結合文字列
[13] [[結合文字]]は、通常は単独では用いません。 [SRC[>>9]]
[[基底文字]]の後に0個以上の[[結合文字]]を続ける形で使います。
[[結合文字]]は、その[[依存]]する[[基底文字]]の後に続けます
[SRC[>>115 P1, >>142, >>164]]。
[HISTORY[
[83]
[[Unicode]]
の[[結合文字]]は後置です。
[[Unicode]] 以前の[[文字コード]]規格には前置式を採用したものもありましたが、
[[Unicode]]
との変換では順序を入れ替える必要があります。
[SEE[ [[非spacing文字]] ]]
]HISTORY]
;;
[151]
この順序は、
[[Semitic scripts]]
と[[インド系文字]]の論理順と一貫したものとされます。
更に、
近代[[フォント]]技術の nonspacing な[[グリフ]]の取り扱いとも合致しているため処理しやすいとされます。
[SRC[>>142, >>164]]
[156]
[[結合文字]]の数には制限がありません。
[SRC[>>142, >>115]]
-*-*-
[46]
[DFN[[RUBYB[結合文字列][combining character sequence]]]] ([DFN[CCS]]) は、
[[基底文字]]が0個または1個の後に、
1つ[[以上]]の[[結合文字]]、
[CODE(charname)@en[ZERO WIDTH JOINER]]、
[CODE(charname)@en[ZERO WIDTH NON-JOINER]]
のいずれかが続くような列であって最長のものです。
[SRC[>>45]]
[FIG(railroad)[
= ?
== [[基底文字]]
= +
== |
=== [[結合文字]]
=== [CODE(charname)@en[ZERO WIDTH JOINER]]
=== [CODE(charname)@en[ZERO WIDTH NON-JOINER]]
]FIG]
[48]
[DFN[[RUBYB[拡張済み結合文字列][extended combining character sequence]]]] ([DFN[ECCS]]) は、
[[拡張済み基底]]が0個または1個の後に、
1つ[[以上]]の[[結合文字]]、
[CODE(charname)@en[ZERO WIDTH JOINER]]、
[CODE(charname)@en[ZERO WIDTH NON-JOINER]]
のいずれかが続くような列であって最長のものです。
[SRC[>>47]]
[FIG(railroad)[
= ?
== [[拡張済み基底]]
= +
== |
=== [[結合文字]]
=== [CODE(charname)@en[ZERO WIDTH JOINER]]
=== [CODE(charname)@en[ZERO WIDTH NON-JOINER]]
]FIG]
;; [80] ただの[[結合文字列]]とは、
[[標準韓音節ブロック]]が含まれるかどうかが違います。
[SEE[ [[拡張済み基底]] ]]
[82]
「結合文字」の列というと0文字以上の[[結合文字]]の列のように聞こえますが、
実はそうではなく[[基底文字]]も (あれば) 含まれますし、
[[結合文字]]のかわりに
[CODE(charname)@en[ZWJ]] / [CODE(charname)@en[ZWNJ]]
が含まれる列のこともあります。
[114]
[[結合文字列]]、
[[拡張済結合文字列]]は[[書記素クラスター]]と似ていますが、
違うこともあります。
[SEE[ [[書記素クラスター]] ]]
** 基底文字と結合文字の関係性
[88]
[[結合文字]]の[DFN[[RUBYB[関連付けられた基底文字][associated base character]]]]は、
その属する[[結合文字列]]中の[[基底文字]]です。
[SRC[>>115 D61a]]
[14] [[結合文字]]の[[図形]]の位置付けは、直前の[[基底文字]]であって非[[結合文字]]で
[[zero width joiner]] でも [[zero width nonjoiner]] でもないものに依存します。
この時[[結合文字]]を[[基底文字]]に[DFN[[RUBYB[適用する]@en[apply]]]]といいます。 [SRC[>>9]]
[[結合文字]]は[[関連付けられた基底文字]]に[DFN[[RUBYB[依存する][depend]]]]といいます
([DFN[[RUBYB[依存性][dependence]]]])
[SRC[>>115 D61a]]。
[118] [[関連付けられた書記素基底]]とそれへの[[適用][関連付けられた書記素基底]]
([[図形的適用]])
と似た意味ですが、
少しずつ定義が違います。
[[依存性]]はすべての種別の[[結合文字]]に関係します。
[[図形的適用]]は可視[[グリフ]]を持つ
[[nonspacing mark]]
に関係します。
** 孤立結合文字
[15] [[結合文字]]が[[適用]]されるべき[[基底文字]]がない場合 ([[結合文字]]が先頭の場合や、
[[制御文字]]や[[書式文字]]が前にある場合) には、
[DFN[[RUBYB[[[孤立結合文字]]]@en[isolated combining character]]]]といいます。 [SRC[>>9]]
[81]
[[結合文字列]]のうち[[基底文字]]がないものを[DFN[[RUBYB[欠陥結合文字列][defective combining character sequence]]]]といいます。
[SRC[>>49]]
[117]
[[欠陥結合文字列]]中の[[結合文字]]には[[関連付けられた基底文字]]がありません。
どの[[基底文字]]にも[[依存する]]とはいえません。
[SRC[>>115 D61a]]
[19]
[[完全正規化済み]]など孤立した[[結合文字]]が出現しないことを要求する[[応用]]もあります。
[89]
意図的に使うことはあまりありませんが、
[[Unicode文字]]の一覧表などに出現することがあります。
[[結合文字]]を考慮しない[[文字列]]の分断 (一定の文字列長での分割など)
で生じることもあります。
** 基底文字の種類
[85]
[[結合文字]]が[[適用]]される[[基底文字]]には制約がありません。
すべての[[結合文字]]は、すべての[[基底文字]]に対して使うことが出来ます
[SRC[>>142]]。
普通はありえない[[基底文字]]と[[結合文字]]の組合せ、
例えば[[基底文字]]を「。」 ([[句点]])、
[[結合文字]]を[[濁点]]とするような組合せは[[日本語]]としておおよそあり得ませんが、
[[Unicode]]
として禁止されていません。
(それが意味を成すか、
意図した通りにレンダリングされるかどうかは、
また別の問題です。 >>148)
[HISTORY[
[146]
[[Unicode]]
と
[[Unicode]]
以外の[[文字コード]]を混在させられるシステムもあります。
例えば
[[ISO/IEC 2022]]
は
[[ISO/IEC 10646]]
と混在させる仕組みを定義しています。
すると
[[Unicode]] ([[ISO/IEC 10646]])
とそれ以外の[[基底文字]]と[[結合文字]]の組合せも理屈の上では存在し得ます。
しかし
[[Unicode]]
はそうしたものを想定していないので何も言及していませんし、
[[ISO/IEC 2022]]
側にもそうした[[規定]]はありません。
結局そのようなシステムがどう動作するべきかは不明と言わざるを得ません。
]HISTORY]
-*-*-
[86]
[[結合文字]]自体を単独の[[文字]]として使いたいときは、
[[基底文字]]として
[CODE(char)[U+00A0]] [CODE(charname)@en[NO-BREAK SPACE]]
を使うことが出来ます。
[SRC[>>142, >>164]]
[162]
[[Unicode 4.1]]
までは、
[CODE(char)[U+0020]] [CODE(charname)@en[SPACE]]
を使うことが[RUBYB[[[推奨]]][recommended]]されていましたが、
推奨されなくなりました。
[[XML]]
などの
[CODE[U+0020]]
の扱いと衝突することが理由とされています。
[SRC[>>142, >>164]]
[87]
[[HTML]] と [[CSS]] ([CODE[white-space:normal]])
のような[[空白]]を正規化する処理が適用される環境では、
[CODE[U+0020]] を使うと思わぬ意図せぬ結果がもたらされることがあります。
[92]
[[CSS]] の [CODE[text-emphasis]] は [CODE[Z*]]
の文字かどうかで挙動が変わりますが、
[[間隔]]と[[結合文字]]が組み合わさったケースでは一般の文字と同じ扱いになります。
[163]
[CITE[The Unicode Standard]]
の「推奨」
は変更されましたが、
[[互換分解]]は変更されていません (一度決めたら変更されないこととされています)。
多くの単独の[[ダイアクリティカルマーク]]は
[[NFKC]]、
[[NFKD]]
を適用すると
[CODE[U+0020]]
が生成されてしまいます [SRC[>>164]]。
(もっとも [CODE[U+00A0]] も [[NFKC]], [[NKFD]] では [CODE[U+0020]]
になります。)
[169]
[CODE[U+00A0]]
を始め[[中立方向性]]の[[文字]]を[[基底文字]]とするとき、
[[bidi]]
処理によって[[基底文字]]と[[spacing結合文字]]が分離されて意図せぬ形で表示される場合があります。
[SRC[>>164]]
これを避けるには
[CODE(charname)@en[LRM]],
[CODE(charname)@en[RLM]],
[CODE(HTMLe)@en[bdi]]
の類を適宜使う必要があります。
-*-*-
[139]
[[韓音節]]の[[書記素クラスター]]にあっては、
[[結合文字]]は最後の[[字母]]だけではなく[[音節]]全体に[[適用]]されます。
[[enclosing combining mark]]
も[[音節]]全体を囲みます。
[SRC[>>115]]
[161]
[[基底文字]]の並びが[[合字]]として表示される場合であっても、
[[結合文字]]はそれが[[適用]]されるべき各部分の[[基底文字]]の後に置きます。
[[結合文字]]は [[ligated glyph]] の各部分に対して表示します。
[SRC[>>142, >>164]]
;; [175] ただし[[合字]]になるかどうかは
[[typographic]] 的な慣習に依存します。
[[ダイアクリティカルマーク]]が付かない時[[合字]]化されても、
[[ダイアクリティカルマーク]]が付いたことで[[合字]]化されないこともあります。
[SRC[>>164]]
* 性質
[11] [[正準結合クラス]]が 0 でない[[文字]]は、[[結合文字]]です。
しかし[[逆]]は真ではありません。[[正準結合クラス]]が 0 の[[結合文字]]もあります。 [SRC[>>9]]
;; [22] >>21 は、[[正準結合クラス]]が 0 の[[結合文字]]の一覧です。
[REFS[
- [21] [CITE@en[Character set "$unicode:Mn | $unicode:Mc | $unicode:Me - $unicode:Canonical_Combining_Class:non-0"]] ([TIME[2015-03-22 23:52:41 +09:00]] 版) <https://chars.suikawiki.org/set?expr=%24unicode%3AMn+%7C+%24unicode%3AMc+%7C+%24unicode%3AMe+-+%24unicode%3ACanonical_Combining_Class%3Anon-0>
]REFS]
[153]
多くの[[アルゴリズム]] (すべてではありません。) は、
[[基底文字]]に[[結合文字]]が続く列を、
[[基底文字]]の[[特性][特性 (UCD)]]を持つものとして扱います。
[SRC[>>142]]
(これがうまく機能しないケースもあります (>>149)。)
* 結合文字相互の順序
[119]
[[指針]]として、
同じ[[結合クラス]]の
[[nonspacing mark]]
は、
通常、
[[適用]]する[[書記素基底]]から図形的に外側に向かって配置していきます
([DFN[inside-out application]],
[DFN[default stacking behavior]])。
[SRC[>>115 P2]]
上側に置く[[結合文字]]は垂直に上方向へ、
下側に置く[[結合文字]]は垂直に下方向へと重ねていきます。
[SRC[>>142, >>115 P2]]
[EG[
[157]
[[タイ文字]]にあっては、
[[子音文字]]に対して
[CODE[U+0E34]] - [CODE[U+0E37]] の[[母音]]を上に置き、
更に
[CODE[U+0E48]] - [CODE[U+0E4B]] の[[声調記号]]をその上に置きますので、
この順序で[[文字]]を並べます。
[SRC[>>142]]
]EG]
[120]
[[指針]]として、
特定の
[[nonspacing mark]]
については、
垂直に並べる [[default stacking behavior]]
ではなく、
[[書記素基底]]の上下に横並びで、
[[言語]]依存の[[正書法]]規則に従い配置します
([DFN[side-by-side application]])。
[SRC[>>115 P3]]
[121]
[[side-by-side application]]
における[[結合文字]]の視覚的なレンダリング順序は、
当該[[用字形]]における支配的な順序に依ります。
[SRC[>>115 P3, >>142]]
[[左横書き]]では左から右に並べます。
[SRC[>>142]]
[[ギリシャ文字]]では[[書記素基底]]の上に、
1つ目の[[結合文字]]を左側、
2つ目の[[結合文字]]を右側に置きます。
[[ヘブライ文字]]では逆側に置きます。
[SRC[>>115 P3]]
- [158]
例えば[[ギリシャ文字]]にあって、
[[breathing mark]]
の
[CODE[U+0313]] [CODE(charname)@en[COMBINING COMMA ABOVE]],
[CODE[U+0314]] [CODE(charname)@en[COMBINING REVERSED COMMA ABOBE]]
は、
[[acute accent]], [[grave accent]]
と併用する時、
[[side-by-side application]]
します。
[[基底文字]]、
[[breathing mark]]、
[[accent mark]]
の順に並べ、
[[基底文字]]の上に左が
[[breathing mark]]、
右が
[[accent mark]]
と表示されます。
[SRC[>>142]]
- [122]
[CODE[U+1ABB]] [CODE(charname)@en[COMBINING PARENTHESES ABOVE]],
[CODE[U+1ABC]] [CODE(charname)@en[COMBINING DOUBLE PARENTHESES ABOVE]],
[CODE[U+1ABD]] [CODE(charname)@en[COMBINING PARENTHESES BELOW]]
は [[side-by-side application]] します。
[SRC[>>115 P3]]
これらは[[ドイツ語]]の[[方言学]]で、
[[発音]]の[[修飾子]]の効果が弱められることを表します。
これらよりも前にある[[ダイアクリティカルマーク]]を囲むように配置します。
[SRC[>>164]]
-- [181] これも [[side-by-side application]]
の一種とされますが、その定義とは少し違う別種の配置のような...
[123]
[[指針]]として、
伝統的な
[[typographic]]
な挙動により
[[nonspacing mark]]
の既定の配置を上書きする場合があります。
[SRC[>>115 P4]]
- [168] [[基底文字]]との関係で[[結合文字]]の[[字形]]が変化するケース: >>124, >>125
- [126]
[[アラビア文字]]の[[母音記号]]の相対配置は
[[default stacking behavior]]
だけでは説明できず、
[[アラビア文字]] [[typography]]
の伝統的規則に依存します。
[SRC[>>115 P4]]
- [160]
[[ヘブライ文字]]、
[[キリル文字]]でも特別な扱いが必要となります。
[SRC[>>142]]
[136]
[[指針]]として、
[DFN[[CODE[Soft_Dotted]]]]
[[特性][特性 (UCD)]]の[[文字]]に
[DFN[nonspacing mark above]]
([CODE[ccc]] = [DFN[[N[230]]]]
の[[結合文字]])
が[[適用]]されるとき、
[[基底文字]]に元々有る[[点]]は、
表示しません。
[SRC[>>115 P9]]
[137] [CODE[i]] や [CODE[j]] の類が該当します。
この上に[[ダイアクリティカルマーク]]が来る時、
[[点]]のかわりに[[ダイアクリティカルマーク]]を書きます。
[[リトアニア語]]のように[[点]]と[[ダイアクリティカルマーク]]の両方を書く[[言語]]では、
[CODE[U+0307]] [CODE(charname)@en[COMBINING DOT ABOVE]]
を使います
[SRC[>>115 P9]]。
[REFS[
- [138] [CODE[Soft_Dotted]] な文字の一覧
<https://chars.suikawiki.org/set/%24unicode%3ASoft_Dotted>
]REFS]
-*-*-
[127]
[N[0]] で''ない''[[結合クラス]]の
[[non-spacing mark]]
の順序を入れ替えても、
[[結合文字列]]の視覚的表示や解釈は変化しません
([DFN[nondistict order]])。
[SRC[>>115 P5]]
そのような場合は任意の順序で書くことが出来ます [SRC[>>142]]。
[[正準再順序付けアルゴリズム]]はこの性質に関する[[正規化]]の処理です。
[[NFC]]
などの[[正規化]]を適用すると、
[[結合文字]]の順序が交換されることがありますが、
それは解釈に影響が出ない場合に限られます。
[128]
[[combining grapheme joiner]]
を使うと
[[nondistinct order]]
であっても[[正準再順序付け]]を抑制できます。
[SRC[>>115 P5]]
-*-*-
[129]
[[指針]]として、
[[enclosing mark]]
は、
[[関連付けられた書記素基底]]やそれとの間にある
[[enclosing mark]]
を囲むものとなります。
[SRC[>>115 P6]]
[130]
[[囲み文字]]に
[[nonspacing mark]]
を付けて更に囲むような入れ子の構造も記述できます。
-*-*-
[182]
[CODE[U+1DC0]] [CODE(charname)@en[COMBINING DOTTED GRAVE ACCENT]],
[CODE[U+1DC1]] [CODE(charname)@en[COMBINING DOTTED ACUTE ACCENT]]
は、
[[ギリシャ文字]]で使われ、
[[dialytika varia]]
と
[[dialytika oxia]]
の組み合わせの[[異体字]]です。
[CODE[U+0308]] [CODE(charname)@en[COMBINING DIAERESIS]],
[CODE[U+0300]] [CODE(charname)@en[COMBINING GRAVE ACCENT]],
[CODE[U+0301]] [CODE(charname)@en[COMBINING ACUTE ACCENT]]
と混じると通常の stacking rule
では[RUBYB[結果が信頼できない][cannot be reliably formed]]ために別の文字として追加されたといいます。
[SRC[>>164]]
;; [183] 理由が「表現できない」ではなく「信用できない」であるところに[[闇]]を感じます...
* 二重ダイアクリティカルマーク
[170]
[[二重ダイアクリティカルマーク]]の[[結合文字]]は、
2つの[[基底文字]]の上や下に表示されますが、
1つ目の[[基底文字]]の後に続く[[結合文字]]として使います。
[131]
[[指針]]として、
[[二重ダイアクリティカルマーク]]な
[[nonspacing mark]]
は、
[[書記素基底]]に[[適用]]しますが、
次の[[書記素基底]]も包むような[[グリフ]]として[[レンダリング]]されることが意図されています。
[SRC[>>115 P7]]
- [132] [CODE[U+0360]] [CODE(charname)@en[COMBINING DOUBLE TILDE]]
が該当します。
[SRC[>>115 P7]]
[133]
[[指針]]として、
[[二重ダイアクリティカルマーク]]な
[[nonspacing mark]]
は、
[[書記素基底]]の上下に積んだ通常の
[[nonspacing mark]]
の最外側に「浮動」します。
[SRC[>>115 P8, >>164]]
(surrounding diacritics は除きます。 [SRC[>>164]])
[135]
ただ
[[enclosing mark]]
と[[二重ダイアクリティカルマーク]]との図形的な相互作用は十分に定義されておらず、
多くの[[フォント]]や[[レンダリング]]処理はこれを適切に扱えないかもしれません。
従って両者を同じ[[書記素クラスター]]に含めることは[RUBYB[[[推奨]]されません][not recommended]]。
[SRC[>>115 P8]]
;;
[134]
[[二重ダイアクリティカルマーク]]な
[[nonspacing mark]]
の[[結合クラス]]は非常に高く設定されているので、
[[正準順序]]では[[結合文字列]]の最後の方に現れます。
[SRC[>>115 P8, >>164]]
[171]
[CODE(charname)@en[COMBINING GRAPHEME JOINER]]
を使うと[[正準再順序付け]]が抑制されます
[SRC[>>164]]。
それ以前の[[結合文字]]とそれ以後の[[結合文字]]が区別されることになります。
これを使うと、通常なら[[二重ダイアクリティカルマーク]]より内側に表示される[[結合文字]]を、
[[二重ダイアクリティカルマーク]]より外側に表示するよう指定できます。
[SEE[ [CODE(charname)@en[COMBINING GRAPHEME JOINER]] ]]
[178]
[[縦書き]]時の扱いは特に規定されておらず、注意が必要となります。
[SEE[ [[縦書き字形]]、[[組み合わせて使う文字]] ]]
-*-*-
[172]
3文字以上に対する[[ダイアクリティカルマーク]]は、
[[Unicode]]
では扱えないとされています。
[[マーク付け]]によって記述するべきだとされています。
[SRC[>>164]]
[173]
限られた状況では [[combining half mark]]
が活用できることもあるものの、
[[平文]]で満足できる[[レンダリング]]は成せないといいます。
[SRC[>>164]]
[174]
こうしたものを用いる[[応用]]の実装のためには、
[[Unicode]]
で[[結合文字]]として記述できる[[二重ダイアクリティカルマーク]]だけでなく、
[[マーク付け言語]]により記述される三重以上の[[ダイアクリティカルマーク]]をも扱える仕組みが
(共通であれ別々であれ)
必要となってきます。
* 結合文字の前後連結
[176]
[DFN[[[結合文字]]として[[傍線]]を表す[[文字]]][傍線の結合文字]]があります。
- [CODE[U+0332]] [CODE(charname)@en[COMBINING LOW LINE]]
- [CODE[U+0333]] [CODE(charname)@en[COMBINING DOUBLE LOW LINE]]
- [CODE[U+0305]] [CODE(charname)@en[COMBINING OVERLINE]]
- [CODE[U+033F]] [CODE(charname)@en[COMBINING DOUBLE OVERLINE]]
[177]
これらは左右と接続されることが想定され、
組み合わせて使うことで文字列の上や下の連続線となります。
他の[[結合文字]]との相互作用や、
[[字間]]の[[アキ]]その他の扱いのことがありますから、
こうした[[文字]]によって[[下線]]や[[上線]]を引くのは[RUBYB[非推奨][discouraged]]で、
[RUBYB[スタイル指定を使う][styling text]]のがよいとされています。
[SRC[>>164]]
;; [180] 実質的にこの4文字の利用は[[非推奨]]ということでしょうか。
[179]
[[縦書き]]時の扱いは特に規定されておらず、注意が必要となります。
[SEE[ [[縦書き字形]]、[[組み合わせて使う文字]] ]]
-*-*-
[184]
[[二重ダイアクリティカルマーク]]を分割した[[結合文字]]である
[[combining half marks]]
もあります。
これらは[[互換性文字]]で、
[[二重ダイアクリティカルマーク]]が[RUBYB[好ましい][preferred]]とされます。
[SRC[>>164]]
* レンダリング
[148] 任意の[[結合文字]]は任意の[[基底文字]]に[[適用]]できますが、
実装はすべての組合せを等しく良く対応する必要はありません。
[SRC[>>85]]
[16] [[結合文字]]が[[孤立結合文字]]である場合や、[RUBYB[図形的結合]@en[graphical combination]]を行えない場合には、
図形的結合なしに、[[基底文字]]であるかのように表示して構いません。 [SRC[>>9]]
[17] [[Unicode]] [[符号表]]の[[代表画像]]には点線の円が示されています。
[SRC[>>9, >>164]]
直前の[[基底文字]]と図形的結合して表示する場合には、[[基底文字]]を点線円部分に示すことが想定されています。 [SRC[>>9]]
[SEE[ IDS との関係は [[IDC]] ]]
[159]
[[default stacking behavior]]
は素朴な方法で[[基底文字]]と[[結合文字]]を重ねて表示することで
(品質はともかく)
一応実現可能です。
しかしその他の処理が必要となってくると、
表示位置や表示サイズを細かく制御する必要が生じてきます。
-*-*-
[152]
[[インド系文字]]の[[母音記号]]の[[結合文字]]には、
[[子音文字]]や[[子音クラスター]]の左側に[[レンダリング]]されるものもあります。
[[左横書き]]で左から右に[[文字]]を並べ、
[[基底文字]]の後に[[結合文字]]を置く順序であっても、
[[基底文字]]が右、[[結合文字]]が左とそこだけ逆転します。
これは表示順ではなく発音順を取ったもので、
[[Unicode]] 以前の[[文字コード]] [[ISCII]]
の方式に倣ったものとされます。
[SRC[>>142]]
** 非前進マーク
[32]
[[非前進マーク]]の[RUBYB[[[表現]]][presentation]]上の位置は[[基底文字]]に依存します。
通常はそれ自体に関して [[visual baseline]] に対して間隔を消費しません。
[SRC[>>30]]
[33]
ただし、[[非前進マーク]]の大きさによって[[基底文字]]の表示位置が影響されることはあります。
[SRC[>>30]]
[EG[
[34] 例えば [CODE[U+20DD]] [CODE(charname)@en[COMBINING ENCLOSING CIRCLE]]
を使うと (それ自体が独立して表示幅を取ることはありませんが)
その前の[[基底文字]]の周りに円を描画して、かつ前後の[[文字]]と表示が重ならないよう、
[[基底文字]]の表示位置が通常と変化することになります。
]EG]
-[167]
[CODE[U+0301]] [CODE(charname)@en[COMBINING ACUTE ACCENT]]
のように、
[[ラテン文字]]としての[[字形]]と[[ギリシャ文字]]としての[[字形]]が異なるものもあります
[SRC[>>164]]。
つまり[[基底文字]]によって[[字形]]が変化します。
なお[[ラテン文字]]であっても[[ポーランド語]]と[[フランス語]]とでは[[字形]]
(角度) が違います
[SRC[>>164]]。
- [124] [CODE[g]] の下方と [[combining comma below]]
が衝突してしまうので、
かわりに
[[inverted comma above]]
として伝統的に[[レンダリング]]されてきました。
[SRC[>>115 P4, >>164]]
- [125] [CODE[d]] の上方と
[[combining caron]]
が衝突してしまうので、
かわりに
[[apostrophe]]
として伝統的に[[レンダリング]]されてきました。
[SRC[>>115 P4, >>164]]
** 囲み結合マーク
[149]
[[combining enclosing mark]]
は、
[RUBYB[[[記号]]][symbol]]を表現する[[文字]]に使うのに[RUBYB[留めるのがいいです][best to limit]]。
[SRC[>>142]]
[155]
その理由は、
[[文字特性]]の不一致が起こることでの驚きを抑えられることとされています。
[SRC[>>142]]
例えば
[CODE[U+0021]] [CODE(charname)@en[EXCLAMATION MARK]]
と
[CODE[U+20E4]] [CODE(charname)@en[COMBINING ENCLOSING UPWARD POINTING TRIANGLE]]
で[[警告マーク]]を表せますが、
[CODE[!]]
が[[句読点]]であるが故に[[改行]]について通常の[[記号]]とは異なる挙動を示します。
故に
[CODE[U+26A0]] [CODE(charname)@en[WARNING SIGN]]
は別に単独の[[記号]]として用意されており、
[[正規化]]による[[分解]]もされません。
[SRC[>>153]]
その他一般に合成済の[[囲み文字]]は[[互換分解]]はあっても[[正準分解]]はされません。
これは[[特性][文字特性]]の不一致が理由とされます
[SRC[>>164]]。
[154] [CODE[Vertical_Orientation]]
は[[書記素クラスター]]に対して定義され、
[CODE[Me]]
の場合だけ[[書記素基底]]ではなく固定値が割り当てられます。
[SEE[ [CODE[Vertical_Orientation]] ]]
[HISTORY[
[140]
古い実装は、
[[Indic consonant conjunct]]
や、
[[combining grapheme joiner]]
で連結された[[書記素クラスター]]群全体に対して
[[enclosing combing mark]]
で囲んでいました。
そうした手法には数々の問題があるので、
[RUBYB[推奨されません][not recommended]]。
[SRC[>>115]]
]HISTORY]
** 前進マーク
[41]
[[前進マーク]]は一般に[[基底文字]]とそう違わない挙動を示します。
[SRC[>>39]]
[42]
しかし [CODE[U+0BCA]] [CODE(charname)@en[TAMIL VOWEL SIGN O]]
のように、
([[囲みマーク]]でないにも関わらず)
[[基底文字]]の両側に[[レンダリング]]されるものもあります。
[SRC[>>39]]
* データ形式と結合文字
[95]
[[テキスト]]系の[[データ形式]] ([[マーク付け言語]])
と[[結合文字]]の関係は、
[[テキストファイル]]としての表示や編集を考慮する時、
やや複雑になります。
[96]
例えば [[HTML]] の[[タグ]]の直後に[[結合文字]]が来ると、
[[テキストファイル]]として見た時[[タグ]]の最後の [CODE[>]] と[[結合文字]]が合成されて表示されてしまいます。
[98]
[[文字参照]]や[[エスケープ]]のような機能を使うと、
[[結合文字]]を直接入力しづらいときでも、
代替表現で容易に指定できます。
[97]
[[完全正規化済]]はこうした不思議な挙動を避けることを求めたものでしたが、
普及しませんでした。
* CSS と結合文字
[94]
[[CSS]] の[[結合文字]]の扱いは[[仕様書]]上は必ずしも明らかではありません。
例えば[[基底文字]]と[[結合文字]]が連続する別の[[要素]]に属する時でも合成されて表示されるべきかどうか、
両方の[[要素]]で[[特性]] (例えば [CODE['[[color]]']]) が違うときどう表示されるべきか、
明確ではありません。
[93]
[CODE[::first-letter]]
は最初の[[文字]]の後に[[結合文字]]があれば、
それも含みます。
[[CSS2]]
仕様書には[[結合文字]]だけ[[子要素]]に入っている場合であっても、
そこまで含まれるという実例が示されていました。
[[CSS2]]
の改訂である
[CITE[[[Selectors 3]]]]、
その改訂である
[CITE[[[CSS Pseudo-Elements Module Level 4]]]]
ではなぜかその実例はなくなっています。
[SEE[ [[::first-letter]] ]]
[90] [CITE[html - Highlighting Combining Characters - Stack Overflow]], [TIME[2020-12-06T02:34:51.000Z]] <https://stackoverflow.com/questions/26407896/highlighting-combining-characters>
[91] [[書字方向]]は[[結合文字]]処理などを経た [[grapheme cluster]]
を対象に挙動が定義されています。
[SEE[ [[CSS Writing Modes]] ]]
* 正規化
[SEE[ [[正準等価性]] ]]
* セキュリティー
[SEE[ [[文字のセキュリティー]] ]]
* 関連
[68] 前置式の [[subtending mark]] もあります。
* 歴史
[35]
現在の
[[Unicode]]