2020年09月26日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 420 count

【入門級】1文字なのにLengthプロパティが2になる文字がある

Written By: 川俣 晶連絡先

ニコニコ絵文字の罠 §

 絵文字"😄"の1文字の長さをLengthプロパティで取得すると1文字であるにも関わらず2になります。

 なぜでしょう?

 C#の文字はchar型で表現されますが、これは事実上0~65535を表現する整数です。C#の文字列はUnicodeですが、これ以上の番号を持つUnicodeの文字はそのままでは表現できません。そこで、サロゲートペアと呼ばれる【2つの番号で1文字を表現する技術】で文字を拡張しています。比較的新しい時代に規格に登録された文字はほぼサロゲートペアを必要とする文字に含まれます。絵文字もそれに含まれます。

 Unicodeには、この他に合成文字(複数の文字を合成して1文字を表現するもの)も存在し、正しく文字列の長さから実際の長さを得るのはかなり面倒です。

 文字列はいちいち文字単位にバラさないで右から左に受け渡すようにしておくと安全です。ただし、サロゲートペアに含まれる番号は明確に定義されている(前半 U+D800 〜 U+DBFF、後半 U+DC00 〜 U+DFFF)ので、その番号の値は素通しすると決めていればchar単位にバラしてもあとで元に戻せば大丈夫です。

罠の数々 §

  • 普通はこういう面倒なことはあまり考えなくてもプログラムは書ける。アルファベット、数字、基本的な記号類、ひらがな、カタカナ、基本的な漢字など、普段使う文字はほとんど1文字=Lengthが1と考えて良い。しかし、絵文字が入ってくるとこの原則は崩れてしまう
  • 特殊な漢字、中国語などが入ってくる場合は要チェック
  • 他に合成文字などもあって、本格的に全ての機能を正しく実装しようと思うとかなり面倒。よくサロゲートペアを「なぜ存在するのか分からない最悪の発明」「UTF-8があればいい」という意見を見かけるが、残念ながらサロゲートペアの他にも罠は多い。1文字=Lengthが1にはならないのである。
  • 実は既定の設定だとコンソールアプリで絵文字を表示できない。日本の既定の設定だとコンソールはシフトJIS(CP932)で動作しているからだ。この場合、Unicodeの多くの文字は?や??に化ける。

参考リンク §

String.Length プロパティ

 上記のページを見に行くと最初に【現在の String オブジェクト内の文字数を取得します。】と書いてあって単純に【文字数が分かる】かのように思えるが、注釈でそうではないことを示している。上記ページの注釈まできちんと読んでみよう。

リポジトリ §

https://github.com/autumn009/cshowto

CharLength §

using System;

class Program

{

    static void Main()

    {

        var s = "😄";

        Console.WriteLine(s.Length);

    }

}

実行結果

2

Facebook

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?
キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
09月
27日
【入門級】数字の文字コードは値の順に並んでいる
3days 1 count
total 368 count
【C# コーディング How To】の前のコンテンツ
2020年
09月
25日
【入門級】配列を複製する4つの方法
3days 2 count
total 393 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20200926102324
サイトの表紙【C# コーディング How To】の表紙【C# コーディング How To】のコンテンツ全リスト 【C# コーディング How To】の入手全リスト 【C# コーディング How To】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.34 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.