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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

2回答

644閲覧

PHPによるUCS形式にエンコードが出来ない

sk02ecg2

総合スコア11

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2019/07/15 06:24

編集2019/07/15 07:26

前提・実現したいこと

PHP7、laravel5.7を使用しています。
リクエストされた漢字1文字(UTF-8)を文字情報基盤データベースのAPI(https://mojikiban.ipa.go.jp/mji/q?UCS=0x9152)を利用して漢字情報を取得したいと思ってます。

そこで漢字をUCS形式にUnicode後、エンコードしようと思うのですが、
文字情報基盤データベース対応のUCS形式にエンコード出来ません。

お恥ずかしい話ですが、プログラミング初心者で文字コードの知識も少ない状態ですがご教授いただけると助かります。
宜しくお願い致します。

試したこと

期待してる値:0x9152 OR U+9152

$chr = '酒'; $ucs = mb_convert_encoding($chr, 'UCS-4', 'UTF-8'); dd($ucs); // b"\x00\x00‘R"
$chr = '酒'; $hex = ord(chr('酒')); $hex_str = bin2hex($hex); dd($hex_str); // 30

補足情報(FW/ツールのバージョンなど)

php.ini文字コード設定:utf-8
laravel database.phpのmysql文字コードセット:utf8mb4
試した事記載ファイルの文字コード:utf-8

もし不足情報ございましたら、ご指摘をお願いします。

更新内容

  1. 文字コード設定の内容追加しました。

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

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

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

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

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

m.ts10806

2019/07/15 06:46

プログラムファイル自体、およびプログラムヘッダーで送信している文字コードは何でしょうか?
sk02ecg2

2019/07/15 07:22

php.iniのデフォルト文字コード:utf-8 laravel database.php utf8mb4 上記の対象コード記載ファイルの文字コード:utf-8 です。 ご確認よろしくお願いします。
m.ts10806

2019/07/15 07:26 編集

文字基盤データベースはあくまでAPIであってLaravelとは関係なさそうな気がします。 ただ・・・UTF-8環境でもb"\x00\x00‘R"と出ないので、どうしたものかと・・手元の単体プログラムだと �R となる。  Laravelかどうかは関係なさそうには思うのですが。 ddではなくvar_dump()だと何と出ますか?
sk02ecg2

2019/07/15 08:23

遅くなりすみません。 同じように文字化けします! また私もLaravelというより、phpによるエンコーディングの仕方や順序が違うのかなと思ってるのですが、 思うような9152という結果が取れずどうしていいか分からない状態です。 最も文字コードをしっかり勉強するべきではあると思いますが。 ``` $chr = '酒'; $encode = mb_detect_encoding($chr); $ucs = mb_convert_encoding($chr, 'UCS-4', 'UTF-8'); var_dump($encode); // string(5) "UTF-8" var_dump($ucs);exit; // string(4) "�R" $chr = '酒'; $encode = mb_detect_encoding($chr); $hex = ord(chr($chr)); $hex_str = bin2hex($hex); var_dump($encode); // string(5) "UTF-8" var_dump($hex_str);exit; // string(2) "30" ```
sk02ecg2

2019/07/15 08:45

最初にレスポンスを頂いたのにすみません。 今回はUCSエンコード後に16進数に変換することが抜けておりました。 その後に文字情報APIに沿うフォーマット(U+[1-9])にするで解決できそうです!! ありがとうございます。 また何か有りましたら、ご教授お願いします。
guest

回答2

0

ベストアンサー

$chr = '酒'; $ucs = mb_convert_encoding($chr, 'UCS-4', 'UTF-8'); dd($ucs); // b"\x00\x00‘R"

ここで、ddすると、ucsの文字コードをutf-8で解釈したものがddされます。
そもそもmb_convert_encodingでは0xXXXのような形式にはできないと思います。

$chr = '酒'; $ucs = mb_convert_encoding($chr, 'UCS-4', 'UTF-8'); bin2hex($ucs); //00009152

これで、9152という文字列が取れるので、先頭の0000を削って0xを付け足せばなんとかなりませんかね?

投稿2019/07/15 08:03

mikkame

総合スコア5036

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

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

sk02ecg2

2019/07/15 08:40

ありがとうございます! 上記方法で対応できました。 あとは文字情報APIに沿った形に0xをつけるようにフォーマット変更してリクエストすることにします! エンコーディングは解決として、ベストアンサーとさせていただきます。
guest

0

書かれたコードで正しく変換されているのでは?
UCS-4の'酒'をUTF-8として表示しようとすると文字化けして' R'になりますよ。

PHP

1<?php 2$chr = '酒'; 3$ucs = mb_convert_encoding($chr, 'UCS-4', 'UTF-8'); 4echo bin2hex($ucs); 5echo "\n"; 6var_dump($ucs); 7?>

実行結果

00009152 string(4) " R"

投稿2019/07/15 08:22

編集2019/07/15 08:32
SHOMI

総合スコア4079

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

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

sk02ecg2

2019/07/15 08:43

ありがとうございます! おっしゃる通り、正しく変換されていました。 その後文字情報APIのフォーマットに変換する必要があったのかと思います。 今回は最初に解決策を教えていただいた方をベストとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問