Skip to content

mb_*code_numericentity Clarify the ValueError conditions - #4852

Merged
jordikroon merged 7 commits into
php:masterfrom
mmalferov:patch-38
Sep 1, 2026
Merged

jordikroon merged 7 commits into
php:masterfrom
mmalferov:patch-38

Conversation

@mmalferov

Copy link
Copy Markdown
Member

In the map parameter of the mb_*code_numericentity functions, any scalar values are allowed, with the caveat that the string scalar must be a numeric string

@lacatoire

Copy link
Copy Markdown
Member

Hi! I looked at the https://github.com/php/php-src/blob/master/ext/mbstring/tests/mb_encode_numericentity.phpt and all the convmap examples use exclusively integer values:

  array(0x0, 0x2FFFF, 0, 0xFFFF)                                                                                                                                                                          
  array(0xFF, 0x2FFFF, 0, 0xFFFF)                                                                                                                                                                         
  [0, 0, 0, 0, 100, 50, 0, 0xFFFF]      

No floats, numeric strings, booleans, or null values are tested as valid inputs.

Also, the https://github.com/php/php-src/blob/master/ext/mbstring/tests/mb_encode_numericentity_errors.phpt shows the error message is: "must only be composed of values of type int"

This suggests the current documentation ("list of integers") is correct. Could you share how you tested that floats/numeric strings are accepted?

@mmalferov

Copy link
Copy Markdown
Member Author

Could you share how you tested that floats/numeric strings are accepted?

Check this out:

<?php

declare(strict_types=1);

$map = array(128, '01114111', false, null);
$string = 'Hello &#129325;';
echo mb_decode_numericentity($string, $map, 'UTF-8'); // Hello 🤭

I get that $map is supposed to be integers only. But in practice, it accepts more than just int. Probably type coercion "breaks" the intended behavior :)

Anyway, in userland, passing values of other types into the parameter — contrary to the description — produces no warnings, no errors, no exceptions. That means the statement

mb_decode_numericentity() now throws a ValueError if map is not a list of ints.

does not match the actual function behavior

Comment thread reference/mbstring/functions/mb-decode-numericentity.xml Outdated
Comment thread reference/mbstring/functions/mb-encode-numericentity.xml Outdated
@lacatoire

Copy link
Copy Markdown
Member

Could you share how you tested that floats/numeric strings are accepted?

Check this out:

<?php

declare(strict_types=1);

$map = array(128, '01114111', false, null);
$string = 'Hello &#129325;';
echo mb_decode_numericentity($string, $map, 'UTF-8'); // Hello 🤭

I get that $map is supposed to be integers only. But in practice, it accepts more than just int. Probably type coercion "breaks" the intended behavior :)

Anyway, in userland, passing values of other types into the parameter — contrary to the description — produces no warnings, no errors, no exceptions. That means the statement

mb_decode_numericentity() now throws a ValueError if map is not a list of ints.

does not match the actual function behavior

Thanks for verifying this.

@jordikroon
jordikroon merged commit 3505aae into php:master Sep 1, 2026
2 checks passed
@mmalferov
mmalferov deleted the patch-38 branch September 1, 2026 19:54
lacatoire added a commit to php/doc-fr that referenced this pull request Sep 1, 2026
…_numericentity() (#3466)

Translation of php/doc-en#4852 (commit 3505aae): the error is raised when map
contains a value that is not an int, float, bool, null or numeric string, rather
than when map is not a list of ints. EN-Revision updated.
KentarouTakeda added a commit to php/doc-ja that referenced this pull request Sep 22, 2026
* mb_strpos が返すのがバイト位置ではなく文字位置であることに追従

原文の php/doc-en@97f8edc (php/doc-en#5853) に追従する。

- 戻り値が、バイト位置ではなく 0 から数えた文字位置であることの明確化
- offset が文字単位であることの明記
- 文字オフセットとバイトオフセットが食い違う例の追加
- seealso への mb_strrpos と mb_stripos の追加

* mb_scrub の例を原文に追従

原文の php/doc-en@eb10503 (php/doc-en#5811) に追従する。

- bin2hex と var_dump でバイト列そのものを確認する例の追加 (端末やブラウザ、
  フォントが独自の置換文字で表示するため、見た目だけでは判断できない)
- 結果が mbstring.substitute_character に依存することを示す例
- 不正なバイト列を置き換えると u 修飾子つきの PCRE パターンがマッチするようになる例
- seealso の追加

* mb_decode_numericentity と mb_encode_numericentity の ValueError の条件とコード例に追従

原文の php/doc-en@3505aae (php/doc-en#4852) と
php/doc-en@0bb8d1a (php/doc-en#4708) に追従する。

- ValueError がスローされる条件が「map が整数のリストでない場合」から
  「map に int、float、bool、null、数値形式の文字列のいずれでもない値が
  含まれている場合」に明確化されたこと
- changelog 8.4.0 の条件が「map に暗黙のうちに int に変換できない値が
  含まれている場合」に変わったこと
- コード例の整形 (array( の記法、インデント、閉じ括弧の位置、末尾の ?>)

* 不正なエンコーディングを渡した場合の説明を共有エンティティに追従

原文の php/doc-en@8465ca6 (php/doc-en#5418) に追従する。

- mb_strlen / mb_internal_encoding / mb_encoding_aliases の各ページが
  独自に書いていた説明を、共有エンティティの参照に置き換え
- mb_strlen に、不正なエンコーディングを渡すと PHP 8.0.0 以降は
  ValueError をスローすること (これより前は E_WARNING が発生し、
  false を返していた) を追記
- ValueError のマークアップの誤りを classname から exceptionname に修正

* mb_http_input が ValueError をスローするようになったバージョンの誤りを原文に合わせて修正

原文の php/doc-en@2fab267 (php/doc-en#5252) に追従する。

- type が不正な場合に ValueError をスローするようになったのは
  8.4.0 ではなく 8.0.0 であることの修正

* mb_encode_numericentity のコード例のコメントを翻訳

mb_decode_numericentity の同じコード例では訳されているコメントが、
mb_encode_numericentity では英語のまま残っていた。

あわせて、同じ内容のコメントが 2 ページで食い違わないよう、
mb_decode_numericentity 側の既訳も同一の文面に揃える。offsetN は
値に「追加」するのではなく加算するもので、そこも合わせて直す。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants