スレッド:utf-8-mac 対策について
utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/30(Wed) 11:24:14
No.1433
今回は以下のような簡易的な対策を行っています。
もし、不具合があれば指摘してください。
function fn_utf8_mac($fn)
{
global $utf8_mac;
if ( $utf8_mac != "yes" ) return $fn;
//「全角カタカナ」を「半角カタカナ」
$fn = mb_convert_kana($fn, 'k', 'UTF-8');
//「半角カタカナ」を「全角カタカナ」
$fn = mb_convert_kana($fn, 'K', 'UTF-8');
//「全角ひらがな」を「半角カタカナ」
$fn = mb_convert_kana($fn, 'h', 'UTF-8');
//「半角カタカナ」を「全角ひらがな」
$fn = mb_convert_kana($fn, 'H', 'UTF-8');
return $fn;
}
Re: utf-8-mac 対策について 投稿者:
sawa3 投稿日:2025/07/30(Wed) 13:50:31
No.1434
お世話になっているので、嫌われることを覚悟の上で以下のことをここに発言します。
好きに削除するなり、無視してね。
まず、文章をコンピュータで扱ううえで、文字集合と文字符号化を混同している人多すぎ。
今回の件にしても utf-8-macとしている点で状況を把握してません宣言しているのに等しいです。
文字コード関連はどのようなプログラム・プログラム言語と付き合うにしてもとても重要なものですし、
AIが発達してもAIが作成するコードが正しいと判断するには正しい仕組みを自身が取得し判断する能力がないと役立たずですよ。
で,簡単にしか説明しませんが、といってもこの点を真摯に扱ってきてないととっつきにくいですので、正しく記述していサイトを見つけて理解することをおすすめします。
macOS系(iOS,tvOS等はすべてmacOSの派生です。Apple営業が名付けただけ)でファイルにunicodeを採用したときに合成と分解で
分解されたunicode文字集合を使用するようになった(初期に、最近は違う)。それをUTF-8で符号化したにすぎません。
簡単にいうと、mb_convert_kana()では解決しません。
合成と分解とは、正規化と非正規化で、NFD,NFC,NFKD,NFKCの4つがあります。
で、今回の問題では、正規化形式D(濁点、半濁点を2文字に分解)しているかどうかを知る必要があります。それは、PHP(自分はPHPだけは詳しくない)では、
Normalizer::isNormalized(文字列, Normalizer::FORM_D)で判定します。
そして、合成したいのでしたら、Normalizer::normalize(文字, Normalizer::FORM_C)を利用します。
再度いいますが、この合成と分解を配慮しないといろいろプログラム処理が理想と違うことになります。これはとくにmacだから問題になるわけではないです。
Re^2: utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/30(Wed) 14:42:11
No.1435
Re^3: utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/30(Wed) 15:17:14
No.1436
今回の問題は、本来iSH Shellが対応するしかないと思うのですが
もう2年くらい更新されていませんから
こういう対応しかしようがないんですよね
ちなみにウムラウト記号がどうなるかはテストしていません。
そういう記号を使ったラジオ番組があれば、どなたか教えてください。
Re^4: utf-8-mac 対策について 投稿者:
甘木 投稿日:2025/07/30(Wed) 17:03:35
No.1440
Re^3: utf-8-mac 対策について 投稿者:
sawa3 投稿日:2025/07/30(Wed) 15:21:29
No.1437
お返事ありがとうございます。
正規化したいのでしたら、以下の3stepを踏まないと正しく正規化されませんでした。(PHP,Python,GOで)
全角濁音記号を半角濁音記号に置換
全角半濁音記号を半角半濁音記号に置換
Unicode正規化
今回はファイル名ということですが、詳しく追求していないのですが、WEB関連でもなぜかNFCな文字列なデータのものがあったりし、それも常にではなかったりするので困ります。
Re^4: utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/30(Wed) 15:35:09
No.1438
> お返事ありがとうございます。
> 正規化したいのでしたら、以下の3stepを踏まないと正しく正規化されませんでした。(PHP,Python,GOで)
> 全角濁音記号を半角濁音記号に置換
> 全角半濁音記号を半角半濁音記号に置換
> Unicode正規化
>
> 今回はファイル名ということですが、詳しく追求していないのですが、WEB関連でもなぜかNFCな文字列なデータのものがあったりし、それも常にではなかったりするので困ります。
サンプルリストをおしえてもらえませんか
できればPHP で。
Re^5: utf-8-mac 対策について 投稿者:
sawa3 投稿日:2025/07/30(Wed) 16:21:51
No.1439
先ほど、変換を濁音記号、半濁音記号の変換後にUnicode正規化としていましたが、最近は逆に変更しています。(なぜそうしたか失念してしまいました、、、)
Pythonでは、
import unicodedata
import jaconv
text = jaconv.h2z(transfer_string(unicodedata.normalize("NFC", text)), kana=True, digit=False, ascii=False)
(transfer_stringは、自作全角英数字半角英数字+シンボル変換関数)
で、PHPは、
$text = mb_convert_kana(Normalizer::normalize($text, Normalizer::FORM_C, "aKsV");
こんな感じでうまくいっていました。
Re^6: utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/30(Wed) 20:31:05
No.1443
> で、PHPは、
> $text = mb_convert_kana(Normalizer::normalize($text, Normalizer::FORM_C, "aKsV");
> こんな感じでうまくいっていました。
$text = mb_convert_kana(Normalizer::normalize($text, Normalizer::FORM_D), "aKsV");
だと思いますが、1つ質問です。
ノーマライズした後にmb_convert_kanaをする理由は?
ノーマライズだけではだめなのでしょうか?
Re^7: utf-8-mac 対策について 投稿者:
sawa3 投稿日:2025/07/30(Wed) 22:03:39
No.1447
自分のケースは正規化したかったので、先のコードになってます。
さて、いったんカナ変換するのは、全角・半角の文字と半角の濁音記号で適切でない組み合わせのケースがあると不思議な文字統合がおきること-2文字になったり、3文字になったり自然な形にならないことがあります。とくにテレビやラジオの番組データは担当者が変わったり気まぐれでカタカナや英数字は全角半角が不規則に混合している状態なされると、適切でない組み合わせなるので全角濁音記号を半角濁音記号に置換と全角半濁音記号を半角半濁音記号に置換を実施してまともなデータにしていたようです。(作成した当時の記憶を戻そうとしました。)
Re^8: utf-8-mac 対策について 投稿者:
rfriends 投稿日:2025/07/31(Thu) 02:43:17
No.1451
結論ですが、FORM_Dにノーマライズだけでうまくいきました。
$fn = Normalizer::normalize($fn, Normalizer::FORM_D);
以前やった時にうまくいかなかったのは,
元のファイル名がFORM_Cにノーマライズされていると思い込んでいたせいでした。
if (Normalizer::isNormalized($fn, Normalizer::FORM_C)) {
$fn2 = Normalizer::normalize($fn, Normalizer::FORM_D);
if ($fn2 !== false) {
$fn = $fn2;
}
}
どうもありがとうございました。
すっきりしました。
- WebForum -