mb_strtoupper converts non-alphabetic characters in Shift_JIS (CP932)
まだ誰も着手していません。
- 主要言語
- C
- スター
- 40.4k
- フォーク
- 8.2k
- 平均マージ
- 2日 13時間
- マージ済み PR(30日)
- 96
説明
Description
mb_strtoupper converts non-alphabetic characters in Shift_JIS (CP932)
var_dump(
"\x81\xE0" === mb_strtoupper("\x87\x90", 'cp932')
);
\x81\xE0 and \x87\x90 mean ≒ (U+2252: Approximately Equal to or the Image Of).
var_dump(
"\u{2252}" === mb_convert_encoding("\x81\xE0", 'utf-8', 'cp932'),
"\u{2252}" === mb_convert_encoding("\x87\x90", 'utf-8', 'cp932')
);
\x87\x90 is the one of NEC special characters and was registered in duplicate for historical reasons.
The unintended conversion is caused by a round-trip conversion between Unicode and Shift_JIS.
var_dump(
"\x81\xE0" === roundtrip("\x87\x90", 'cp932'),
"\x81\xE0" === roundtrip("\x81\xE0", 'cp932')
);
function roundtrip($char, $enc) {
return mb_convert_encoding(mb_convert_encoding($char, 'utf-8', $enc), $enc, 'utf-8');
}
As far as I know, 398 characters in Shift_JIS are affected by round-trip conversion. The test code is here.
The same problem applies to mb_scrub, mb_strtolower, mb_convert_case.
var_dump(
"\x81\xE0" === mb_scrub("\x87\x90", 'cp932'),
"\x81\xE0" === mb_strtolower("\x87\x90", 'cp932'),
"\x81\xE0" === mb_strtoupper("\x87\x90", 'cp932'),
"\x81\xE0" === mb_convert_case("\x87\x90", MB_CASE_TITLE, 'cp932')
);
PHP Version
PHP 8.2.10
Operating System
Debian 11.7 (Google ChromeOS 117.0)
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
提供された CP932 の例を再現し、mb_scrub、mb_strtolower、mb_strtoupper、mb_convert_case のエントリポイントを最初の対象範囲として使用します。完了の条件は、重複した NEC 文字シーケンスが正規の CP932 シーケンスと区別されたまま維持され、ラウンドトリップ変換によって変更されず、影響を受ける動作がテストでカバーされることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- php
- 領域
- internationalization
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 38/100