Skip to content
lriki edited this page Jul 6, 2022 · 1 revision

文字列 (ln::String)

文字列を扱うときは ln::String クラスを使います。 ln::String は UTF-32 (char32_t) で文字列を保持します。UTF-32 の文字や文字列リテラルには、U'A', U"ABC" のように U プレフィックスを付けます。

ln::String s = U"Hello!";
std::cout << s;

文字コード, 文字列型 の変換

文字列変換早見表

ln::String へ std::string へ std::wstring へ
ln::String から = str.toStdString()
または
str.toUtf8()
str.toStdWString()
char* から ln::String::fromCStr(str)
または
ln::String::fromUtf8(str)
= N/A
std::string から ln::String::fromStdString(str)
または
ln::String::fromUtf8(str)
= N/A
wchar_t* から ln::String::fromCStr(str) = N/A
std::wstring から ln::String::fromStdWString(str) N/A =
ln::String s1 = U"あいうえお";
std::string s2 = s1.toUtf8();
std::wstring s3 = s1.toStdWString();

toStdString, fromStdString の注意点

これらの変換先・変換元となる std::string (及び char) の文字コードは、プログラムが動作している OS の言語設定により変化します。例えば次のようになります。

  • Unix 系 OS であれば UTF-8
  • 日本語 Windows であれば Shift_JIS
  • 英語 Windows でれば ASCII

文字列を連結する

+=+ 演算子を使うのが簡単です。

ln::String str = U"Hello";
str += U", ";
str = str + U"world!";

std::cout << str; // => "Hello, world!"

長い文字列を連結する場合、上記のような演算子よりも concat を使用すると高速に連結できます。

ln::String str = ln::String::concat(U"LongString1", U"-", U"LongString2");

std::cout << str; // => "LongString1-LongString2"

文字列が空かどうかを確認する

ln::String str = U"ABC";

if (str.isEmpty()) {
    // 空である
}
ln::String str = U"ABC";

if (str) {
    // 空ではない
}

if (!str) {
    // 空である
}

書式指定文字列

ln::format() を使うことで、書式指定文字列を使用した文字列の整形ができます。

ln::format(U"Hello, {}!", U"World");  // => "Hello, World!"
ln::format(U"{:08d}.txt", 12345);     // => "00012345.txt"
ln::format(U"0x{:x}", 255);           // => "0xff"
ln::format(U"0x{:04X}", 255);         // => "0x00FF"

書式文字列の構文は fmt ライブラリと同様です。

文字列の一部を取り出す

ln::String s1 = U"abcdef";
ln::String s2 = s.substr(2, 3);      // => "cde"

文字列を分割する

ln::String s1 = U"a,b,c";
auto tokens = s1.split(U",");      // => ["a", "b", "c"]

文字列を置換する

ln::String s1 = U"ABC";
ln::String s2 = s1.replace(U"AB", U"C");      // => "CC"