String.prototype.toWellFormed() メソッドは、文字列を整形式 UTF-16 文字列に変換するメソッドです。このメソッドは、文字列内の不正なサロゲートペアを Unicode の置換文字 (U+FFFD) に置き換えます[1]

構文

編集
str.toWellFormed()

不整形式の文字列を整形式に変換するプログラム

編集

以下のプログラムは、String.prototype.toWellFormed() を使用して不整形式の文字列を整形式に変換します。

// 単独の高位サロゲートを含む不整形式の文字列
const malformed = 'Hello, \uD800 World';
console.log(malformed.isWellFormed()); // false

// 整形式に変換
const wellFormed = malformed.toWellFormed();
console.log(wellFormed.isWellFormed()); // true
console.log(wellFormed); // "Hello, � World"(不正なサロゲートは U+FFFD に置換される)

このプログラムでは、String.prototype.toWellFormed() を使用して単独の高位サロゲートを含む不整形式の文字列 malformed を整形式に変換しています。不正なサロゲートは置換文字 (�) に変換されます。

複数の不正なサロゲートを持つ文字列を変換するプログラム

編集

以下のプログラムは、String.prototype.toWellFormed() を使用して複数の不正なサロゲートを持つ文字列を変換します。

// 複数の不正なサロゲートを含む文字列
const multipleInvalid = 'A\uD800B\uDC00C\uD800\uD800D';
console.log(multipleInvalid.isWellFormed()); // false

// 整形式に変換
const fixed = multipleInvalid.toWellFormed();
console.log(fixed.isWellFormed()); // true
console.log(fixed); // "A�B�C��D"(すべての不正なサロゲートが置換される)

このプログラムでは、String.prototype.toWellFormed() を使用して複数の不正なサロゲート(単独の高位サロゲート、単独の低位サロゲート、連続する高位サロゲート)を含む文字列 multipleInvalid を整形式に変換しています。すべての不正なサロゲートは置換文字に変換されます。

整形式の文字列に対する動作を確認するプログラム

編集

以下のプログラムは、String.prototype.toWellFormed() が整形式の文字列に対してどのように動作するかを確認します。

// すでに整形式の文字列
const original = 'Hello, 世界! 😊';
console.log(original.isWellFormed()); // true

// 整形式の文字列に toWellFormed() を適用
const result = original.toWellFormed();
console.log(result === original); // true(元の文字列と同じ)
console.log(result); // "Hello, 世界! 😊"(変更なし)

このプログラムでは、String.prototype.toWellFormed() をすでに整形式の文字列 original に適用しています。整形式の文字列に対しては何も変更が行われず、元の文字列と同じ結果が返されます。

文字列処理の安全性を高めるプログラム

編集

以下のプログラムは、String.prototype.toWellFormed() を使用して文字列処理の安全性を高めます。

// 外部から受け取った可能性のある文字列データ
function processUserInput(input) {
  // 入力を整形式に変換してから処理
  const safeInput = input.toWellFormed();
  
  // 以降の処理は整形式の文字列に対して行われる
  const charCount = [...safeInput].length; // 正確な文字数をカウント
  
  return {
    processed: safeInput,
    charCount: charCount
  };
}

// テスト
const userInput1 = 'Hello, 世界!';
const userInput2 = 'Data with \uD800 invalid surrogate';

console.log(processUserInput(userInput1)); // { processed: "Hello, 世界!", charCount: 9 }
console.log(processUserInput(userInput2)); // { processed: "Data with � invalid surrogate", charCount: 28 }

このプログラムでは、String.prototype.toWellFormed() を使用して外部から受け取る可能性のある文字列データを安全に処理しています。入力を整形式に変換してから処理することで、不正なサロゲートによる問題を回避しています。

注意点

編集
  • 置換文字: 不正なサロゲートは Unicode の置換文字 U+FFFD (�) に置き換えられます。
  • 整形式の文字列: すでに整形式の文字列に対して toWellFormed() を呼び出すと、元の文字列がそのまま返されます。
  • ES2022: このメソッドは ECMAScript 2022 で導入されました。古いブラウザではサポートされていない可能性があります。
  • isWellFormed() との関係: String.prototype.isWellFormed() メソッドと組み合わせて使用することで、文字列が整形式かどうかを判定してから変換を行うことができます。
  • パフォーマンス: 大量のテキストを処理する場合、このメソッドを使用すると不正なサロゲートを効率的に処理できます。

脚註

編集
  1. ^ これは、不正な UTF-16 文字列を有効な UTF-16 エンコーディングに変換するために使用されます。

外部リンク

編集