改行コードを正規化
ファイル、貼り付けた文章、自動生成文書、ソースコードにUnixのLF、WindowsのCRLF、旧式の単独CRが混在している場合に、改行コードを正規化します。変換先としてLFまたはCRLFを選択すると、表示される文字をすべて保ったまま行境界を統一します。結果には正規化済みテキスト、選択した変換先、実際に変換された終端の正確な件数が含まれるため、処理内容を容易に検証し、自動化できます。
無料で実行
改行コードを統一する理由
エディター上では同じ文章に見えても、行と行の間に異なるバイト列が含まれることがあります。Unixと現在のmacOSは通常、単一の改行文字LFを使い、Windowsは復帰と改行を組み合わせたCRLFを使います。古いファイルには単独のCRも残っています。アプリ間のコピー、自動生成文と手書き文の結合、アーカイブの展開、異なるOSからの共同作業によって混在が生じます。その結果、バージョン管理の差分が不要に増え、コマンドラインツールや厳密なインポーターが誤動作し、見える内容が同じでもチェックサムが変わります。この機能はCRLFを2文字ではなく1つの終端として認識し、単独LFと単独CRも含めて指定形式へ変換します。文字、空白、タブなどは変更しません。
変換方法と件数の数え方
textフィールドに全文を入力し、targetでLFまたはCRLFを正確に選択してください。変換処理は先頭から末尾まで走査し、単独文字より先にCRLFの組を認識するため、Windowsの改行を二重に数えません。変換先がLFの場合、CRLFと単独CRはそれぞれ1件の変更となり、既存LFは変わりません。CRLFが変換先の場合は単独LFと単独CRが変更され、既存CRLFは維持されます。changedは追加・削除した文字数ではなく、変換した終端数です。CRLFからLFへの置換は出力が短くなっても1件です。改行のない文章、すでに統一済みの文章、空文字列は変更数0で返ります。同じ入力からは常に同じ結果が得られます。
結果を安全に利用する方法
返されたテキストは、ファイル保存、ハッシュ計算、版の比較、パーサーへの入力、別機能への受け渡しにおける標準値としてそのまま使えます。正規化の証跡が必要な場合はchangedを移行ログに保存してください。0なら元から準拠しており、正数なら書き換えた行境界の数を示します。結果にはtargetも再掲されるため、後続処理が外部設定に依存しません。本機能はファイル名やOSから形式を推測しません。暗黙の推測は監査を難しくするためです。リポジトリやUnix系処理には規約に応じてLFを、Windows形式を明示的に求めるソフトウェアにはCRLFを選んでください。未対応の変換先はエラーになります。末尾空白、タブ、最終改行の有無、文字コード、Unicode正規化形式は変更しません。
活用例
コミット前にソースを整える
混在した改行をリポジトリ規約へ合わせ、小さな編集がファイル全体の変更として表示されるのを防ぎます。
厳密なインポーター向けに準備する
LFまたはCRLFだけを受け付けるソフトウェアへ渡す前に、各レコードの終端を統一します。
ハッシュ計算前に標準化する
OSによる違いがダイジェストへ影響しないよう、チェックサム計算前に行境界を統一します。
よくある質問
選択できる改行コードは何ですか?
変換先はLFとCRLFです。それ以外を指定すると入力エラーになります。
CRLFの組は1件と2件のどちらですか?
1つの行終端として扱うため、変更も最大1件です。単独文字より先に組を認識します。
正規化によって末尾に改行が追加されますか?
いいえ。既存の行終端だけを変換し、末尾の行境界を追加も削除もしません。
単独のCRはどう処理されますか?
旧式の行終端として扱い、選択した形式へ1件ずつ変換します。
APIリクエストの料金はいくらですか?
APIリクエスト1回の料金は$0.002です。同じ決定的な変換をブラウザーでも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/data/normalize-line-endings \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"first line\r\nsecond line\nthird line\rfourth line","target":"LF"}'const res = await fetch("https://api.kit.forhosting.com/data/normalize-line-endings", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "first line\r\nsecond line\nthird line\rfourth line",
"target": "LF"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/normalize-line-endings",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "first line\r\nsecond line\nthird line\rfourth line",
"target": "LF"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/normalize-line-endings", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"first line\\r\\nsecond line\\nthird line\\rfourth line","target":"LF"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"first line\r\nsecond line\nthird line\rfourth line","target":"LF"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/normalize-line-endings", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "first line\r\nsecond line\nthird line\rfourth line",
"target": "LF"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.normalize_line_endings",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 25 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |