Unicodeバリエーションセレクタ除去
「Hello ❤️ world ☺️」から隠れた2つのセレクタを取り除くと「Hello ❤ world ☺」になり、17文字が15文字になります。文字、絵文字、句読点、空白は残り、見えない表示切り替えだけが消えます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- Hello ❤️ world ☺️
- 結果
- Hello ❤ world ☺
- 長さ
- 15
- 元の長さ
- 17
- 削除数
- 2
Unicodeのバリエーションセレクタは、基底グリフの直後に置かれ、レンダラに絵文字表示・テキスト表示・特定の字形バリアントのどれを出すかを伝える不可視文字です。メッセージアプリ、SNS、デザインツールからのコピー&ペーストでは、ハートや星などの後にU+FE0F(絵文字スタイル)やU+FE0E(テキストスタイル)が残りやすく、CJK文書ではVariation Selectors Supplementのコードポイントが表意文字の異体字シーケンスとして埋め込まれることがあります。これらのセレクタは文字列の等価比較を壊し、長さを膨らませ、検索インデックスを混乱させ、画面上は同じに見える文字列に不可解な差分を生じさせます。本ツールはテキストをUnicodeコードポイント単位で走査し、標準レンジ内のバリエーションセレクタをすべて除去し、除去数と変更フラグ付きの清浄な文字列を返します。基底文字、絵文字、句読点、空白はそのまま残り、不可視の切替だけが取り除かれます。
バリエーションセレクタ除去の仕組み
バリエーションセレクタは可視の文字ではなく、直前の文字の表示を変える非スペーシングのコードポイントです。主ブロックはU+FE00からU+FE0F(Variation Selectors 1〜16)です。このブロック内では、U+FE0Eが絵文字対応記号にテキスト(モノクロ)表示を、U+FE0Fが絵文字(カラー)表示を要求します。
ハートにFE0Fが続くと色付き絵文字として描画されることが多く、同じ基底だけ、またはFE0E付きではフォントとプラットフォーム次第で素の記号に見えることがあります。第二のブロックU+E0100〜U+E01EF(Variation Selectors Supplement)は、特定字形が必要なCJKの表意文字異体字シーケンスを支えます。
本機能は両ブロックを完全に除去します。実装はコードポイント反復で文字列を走査するため、サプリメントの補助面文字も分割されたサロゲートペアではなく単一単位として認識されます。いずれかのVSレンジに属するコードポイントは破棄して数え、それ以外は結果に連結します。
空文字列は走査前に失敗します。経路は文字列上の純粋なparseであるため、典型的なフォームサイズではレイテンシはサブミリ秒に保たれ、公開コストモデルはモデルトークンではなく解析的です。
バリエーションセレクタ除去が実務で使われる場面
プロダクトとメッセージングのチームは、ユーザー生成コンテンツを正規化し、ユーザーが意図して打っていない不可視の表示切替を等価比較や重複検出が無視するようにします。検索とタグ付けのシステムは、クエリと保存タイトルからバリエーションセレクタを取り除き、ハートがiOSからFE0F付きで来てもプレーンテキストエディタから無しで来てもフィルタが一致するようにします。
コンテンツとローカライズのチームは、ファイル名、URLセグメント(専用スラッグツールを使わない場合)、気難しいリレーでのメール件名、Unicodeを壊す/再符号化ツールで開くCSV向けに、安定した文字列を用意します。
ゼロ幅文字の除去、ダイアクリティカルの削除、完全なUnicode正規化(NFD/NFC)、絵文字ショートコード変換が後で必要なら、このremove-variation-selectorsページを肥大化させず、別の検索意図とランディングとして扱ってください。
よくある質問
バリエーションセレクタ除去とは何ですか?
テキストからUnicodeバリエーションセレクタのコードポイント(U+FE00–U+FE0FおよびU+E0100–U+E01EF)を取り除き、よく使われるFE0F絵文字・FE0Eテキストの表示セレクタを含めて清浄な文字列と除去数を返します。
ゼロ幅スペースやアクセントも除去しますか?
いいえ。 除去されるのはバリエーションセレクタだけです。ゼロ幅スペース、bidiマーク、結合ダイアクリティカル、その他の不可視文字は別ツールが必要です。
すでに清浄なテキストは変わりますか?
いいえ。 バリエーションセレクタが無ければ、resultは元のテキストと等しく、changedはfalse、removedは0です。
取り除いたあともハートはカラーで表示されますか?
フォントや端末によって異なります。絵文字表示を指定するセレクタがなくなるため、白黒の記号として表示する環境もあれば、カラーの絵文字のまま表示する環境もあります。
漢字の異体字を指定するセレクタも消えますか?
はい、消えます。特定の字形を指定するために漢字の後ろに付けられたセレクタも取り除かれ、基本の漢字だけが残ります。字形の指定が必要な文書では注意してください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/str/remove-variation-selectors \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello ❤️ world ☺️"}'const res = await fetch("https://api.kit.forhosting.com/str/remove-variation-selectors", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello ❤️ world ☺️"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/remove-variation-selectors",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello ❤️ world ☺️"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/remove-variation-selectors", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello ❤️ world ☺️"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello ❤️ world ☺️"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/remove-variation-selectors", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Hello ❤️ world ☺️"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.remove_variation_selectors",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
空入力は明確な検証エラーで拒否されるため、クライアントは欠落フィールドに気づけます。
バリエーションセレクタ除去の仕組み
ロケール切替も乱数サンプリングもネットワーク呼び出しもなく、同一入力は常に同一のJSONを返します。文書化された文字上限を超えるペイロードもinvalid_inputで失敗し、単一リクエストがWorkerメモリを独占しないようにします。
送信内容と返却内容
数値と真偽値は十進またはtrue/falseのテキストに強制変換され、オブジェクト、配列、NaN、Infinityは拒否されます。入力にそもそもバリエーションセレクタが無かった場合、resultはtextと等しく、changedはfalse、removedは0となり、ETLガードや単体テストでのノーオペ検出に便利です。典型的な確認例は、末尾FE0F付きハートが素のハートになること、FE0F付きスマイリーが表示セレクタを失い基底絵文字を保つこと、不可視セレクタだけが消える混在文、Supplementセレクタ付きCJKが基底表意文字に戻ることです。清掃したい空でない文字列を、必須フィールドtextに1つだけ送ってください。古いクライアント接続用にinput、value、data、s、message、string、content、bodyなどの別名も受け付けます。成功時の応答は、元のtext、清浄なresult、結果のlength、original_length、真偽のchanged、除去したバリエーションセレクタのコードポイント数removed、operationにremove_variation_selectorsを返します。素早い貼り付けとコピーには無料ブラウザフォームを使い、CSV列・チャット出力・APIペイロードの一括正規化ではスクリプトから同一契約を呼び出してください。成功したAPI呼び出しの料金は公開ベースの$0.002(アイテムあたり)で、空テキストを含む検証失敗は前払い残高を消費しません。
バリエーションセレクタ除去が実務で使われる場面
CRM出力、表計算の列、ソーシャルAPIのダンプを清浄するデータ技術者は、ソフトキー結合や厳密文字列インデックスのウェアハウス投入前に、自由テキストをVS除去へ通すことがよくあります。本機能は純粋なparseエンジンのため、API料金は成功アイテムあたり公開ベースの$0.002で、検証失敗は残高を消費しません。
連携の活用例
チャットとソーシャルAPIの絵文字を正規化
FE0F/FE0Eの表示セレクタを除去し、異なるバリエーション様式を注入するプラットフォーム間でもハートや記号が等しく比較されるようにします。
CSVと自由テキストのエクスポートを清掃
結合・一意性チェック・ウェアハウス投入の前に、一括貼り付けやAPIダンプから隠れたVS文字を取り除きます。
安定したゴールデンテストと検索キー
フィクスチャとファセットラベルを不可視の表示切替から独立させ、テストとフィルタを決定的に保ちます。
技術的な質問
空のテキストを送るとどうなりますか?
リクエストはinvalid_inputで失敗します。空文字列は拒否されるため、クライアントは無言の空結果ではなく欠落フィールドに気づけます。
料金はいくらですか?
ブラウザツールは無料でローカル実行です。APIリクエストは成功アイテムあたり$0.002の前払いKIT残高を使い、無効入力は課金されません。