質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

827閲覧

バイナリ文字を制御文字へエレガントに置換したい。

metal777

総合スコア7

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2018/03/12 04:21

前提・実現したいこと

ログ出力の際に視認性を上げるため、例えば以下のようにバイナリ文字が存在した場合は制御文字への置換を行いたいと考えています。

0x08\b
0x09\t
0x0A\n
0x22\"
0x5C\
0x00\0
0x01\x01

今のところ strtr で愚直に1つ1つマッピングさせて置換する方法くらいしか思いつかないのですが、あまり良い方法とは思えないため、もっと良い案はないでしょうか?

制御文字をバイナリ文字に読み換える機構はPHP(を初めとする各種言語)側に既に存在するため、何かしらその逆にお手軽に変換する方法もあるのではないかと思っているのですが・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

たとえばaaa0x09bbbを → aaa\tbbb にしたとしても
その中身を確認するときには「aaaタブbbb」でしか確認できないので
やる意味がよくわかりません
「\t」という文字列を表示するなら「\t」に切り替えるのでしょうか?
そうなると愚直にstr_replaceで変換表を作るのが妥当です

sample

念のため

PHP

1$from=["\t","\n"]; 2$to=["\t","\n"]; 3$str="aaa\x09bbb\x09ccc 4ddd"; 5 6print str_replace($from,$to,$str);

追記

制御文字に変更するだけならこう

PHP

1/* 制御文字に変換 */ 2$str="a%aa\x09bbb\x09ccc 3ddd"; 4$str=preg_replace('/%(..)/','&#x$1;',rawurlencode($str)); 5$str=str_replace('%','%',$str); 6print $str; 7 8/* 可視化 */ 9$str="a%aa\x09bbb\x09ccc 10ddd"; 11$str=preg_replace('/%(..)/','&#x$1;',rawurlencode($str)); 12$str=str_replace('%','%',$str); 13

投稿2018/03/12 04:37

編集2018/03/12 05:53
yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metal777

2018/03/12 04:40

失礼しました。 実際にテキストエディタ等で開いたときに `\t` と表示したいという理由によるものですので、仰る通り置換表としては `\t` という形になります。
yambejp

2018/03/12 05:00

念のためsamle追記しておきました
guest

0

ベストアンサー

マッピングはある程度違ってきますが(ヌル文字が\u0000になるなど)、json_encodeを使ってみるのもいいかもしれません。

php

1<?php 2 3// 両端の引用符を外す 4$encoded = substr(json_encode('文字列', JSON_UNESCAPED_UNICODE), 1, -1);

3v4lでの実行結果

投稿2018/03/12 04:30

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metal777

2018/03/12 04:46

なるほど、制御文字に置き換わらない幾つかの `\uXXXX` のみを再度置換する前提であれば、この方法はお手軽かもしれません。 (入力対象がUTF-8ではないことがあるのが少々懸念されますが)
退会済みユーザー

退会済みユーザー

2018/03/12 22:45

UTF(8/16/32)じゃなく SJIS でつくられたものはJSONじゃないよ 制御文字はすべて同じマッピングだが SJISだったか 特定の文字コードのように「掲示板」みたいに「改行コード」を「2バイト目」にもっている文字を含む文字列もある rfc7159 ----- JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The default encoding is UTF-8, and JSON texts that are encoded in UTF-8 are interoperable in the sense that they will be read successfully by the maximum number of implementations; there are many implementations that cannot successfully read texts in other encodings (such as UTF-16 and UTF-32).
metal777

2018/03/13 02:27

はい。 HTTPのリクエストログやPOST/PUTされたデータ等のロギングに使用する用途なのですが、文字コードが限定できるのであれば事前に`mb_convert_encoding`でUTF-8に変換した上でmaisumakunさんの方法でJSON化してオブジェクトから両端を取り除いてから `\uXXXX` を置換するのがやりたいことに近いと思いました。
guest

0

回答ではないのですが、
1文字⇒2~4文字 の変換なので、strtrでは無理ですね。

また、0x00 → \0は、0x00 → \x00とかにしておかないと、例えば0x00 0x33 → \03になってしまいこれは8進数の3、つまり0x03の意味になっちゃいます。

投稿2018/03/12 14:50

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metal777

2018/03/13 02:33

`\0` は C言語の表記が頭にあったのでついそう書いてしまいましたが、確かにそうですね。 json_encode の方がお手軽ですが、前後に適度な準備作業が必要なことを考えると、やはり strtr くらいしかない気がしてきました。
otn

2018/03/13 04:16

trという名前から1文字ずつとばかり思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問