概要 PHPでバイト数単位で文字列を切り出す際に、思いつくのはsubstrを利用する方法だろう。 このとき半角文字列のみや全角文字列のみを対象に処理をする場合など、1文字あたりのバイト数が同じであれば問題は生じない。 しかし全角半角混在の文字列など1文字あたりのバイト数が異なる文字列をバイト数単位で切り出す際には注意が必要だ。 問題点 マルチバイトの文字列をsubstrで半端なバイト数単位で切り出すと、 文字列を中途半端な位置で切り出してしまい、不具合の温床となる。 具体例 文字コードSJISにおいて、 Aあいうえお という文字列があったとする。(Aは半角、それ以外は全角) この文字列をsubstrで6バイトで切り出すと、 全角文字(2バイト文字)「う」の1バイト目だけを切り出してしまい文字列が壊れてしまう。 テストコード <?php $target = "Aあいうえお";// 対象文字列
![【PHP】全角半角混在の文字列をバイト数単位で切り出す際にmb_strcutを使うと便利 - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/867f346faf6aefba29abdcba3a541d34eb78ea0f/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9JUUzJTgwJTkwUEhQJUUzJTgwJTkxJUU1JTg1JUE4JUU4JUE3JTkyJUU1JThEJThBJUU4JUE3JTkyJUU2JUI3JUI3JUU1JTlDJUE4JUUzJTgxJUFFJUU2JTk2JTg3JUU1JUFEJTk3JUU1JTg4JTk3JUUzJTgyJTkyJUUzJTgzJTkwJUUzJTgyJUE0JUUzJTgzJTg4JUU2JTk1JUIwJUU1JThEJTk4JUU0JUJEJThEJUUzJTgxJUE3JUU1JTg4JTg3JUUzJTgyJThBJUU1JTg3JUJBJUUzJTgxJTk5JUU5JTlBJTlCJUUzJTgxJUFCbWJfc3RyY3V0JUUzJTgyJTkyJUU0JUJEJUJGJUUzJTgxJTg2JUUzJTgxJUE4JUU0JUJFJUJGJUU1JTg4JUE5JnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0yOGY5ZWZiZmJjMTE1NGUxNDRkZTllNTRiMmMyODQyZQ%26mark-x%3D142%26mark-y%3D112%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwcGFuZGFOTzEyJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1hZGExN2UyODFlYTBmNmIzNjYwM2IwZThkOWJjOGE2OQ%26blend-x%3D142%26blend-y%3D491%26blend-mode%3Dnormal%26s%3D4a7912a42a4b19647d1ba8f62355520a)