股票实时交易网站开发,购买云服务器之后怎么使用,医院网站如何建立,做网站的公司是什么一 对称加密
1.1 openssl
1.1.1 openssl_get_cipher_methods(bool $aliases false)
获取可用的加密算法。包含可用加密算法的array。 请注意#xff1a;在 OpenSSL 1.1.1 版本之前#xff0c;返回加密算法的拼法大小写都有#xff1b; 从 OpenSSL 1.1.1 开始#xff0c…一 对称加密
1.1 openssl
1.1.1 openssl_get_cipher_methods(bool $aliases false)
获取可用的加密算法。包含可用加密算法的array。 请注意在 OpenSSL 1.1.1 版本之前返回加密算法的拼法大小写都有 从 OpenSSL 1.1.1 开始统一只返回小写的形式。
aliases 如果密码别名应该包含在返回的array中则设置为 true.
openssl版本查询
php --re openssl | grep version
Extension [ persistent extension #4 openssl version 7.4.30 ] { $ciphers openssl_get_cipher_methods();$ciphers1 array_filter($ciphers,function ($value) {return str_starts_with($value, aes) TRUE;});var_dump($ciphers1);$ciphers_and_aliases openssl_get_cipher_methods(true);$ciphers2 array_filter($ciphers_and_aliases,function ($value) {return strpos($value, bf) ! FALSE;});var_dump($ciphers2); 测试结果
array(36) {[0]string(11) aes-128-cbc[1]string(21) aes-128-cbc-hmac-sha1[2]string(23) aes-128-cbc-hmac-sha256[3]string(11) aes-128-ccm[4]string(11) aes-128-cfb[5]string(12) aes-128-cfb1[6]string(12) aes-128-cfb8[7]string(11) aes-128-ctr[8]string(11) aes-128-ecb[9]string(11) aes-128-gcm[10]string(11) aes-128-ocb[11]string(11) aes-128-ofb[12]string(11) aes-128-xts[13]string(11) aes-192-cbc[14]string(11) aes-192-ccm[15]string(11) aes-192-cfb[16]string(12) aes-192-cfb1[17]string(12) aes-192-cfb8[18]string(11) aes-192-ctr[19]string(11) aes-192-ecb[20]string(11) aes-192-gcm[21]string(11) aes-192-ocb[22]string(11) aes-192-ofb[23]string(11) aes-256-cbc[24]string(21) aes-256-cbc-hmac-sha1[25]string(23) aes-256-cbc-hmac-sha256[26]string(11) aes-256-ccm[27]string(11) aes-256-cfb[28]string(12) aes-256-cfb1[29]string(12) aes-256-cfb8[30]string(11) aes-256-ctr[31]string(11) aes-256-ecb[32]string(11) aes-256-gcm[33]string(11) aes-256-ocb[34]string(11) aes-256-ofb[35]string(11) aes-256-xts
}
array(5) {[72]string(2) bf[73]string(6) bf-cbc[74]string(6) bf-cfb[75]string(6) bf-ecb[76]string(6) bf-ofb
}
1.1.2 openssl_cipher_iv_length(string $cipher_algo)
获取密码iv长度。成功返回true失败返回false。
cipher_algo 加密方法值范围在openssl_get_cipher_methods()之内。当密码方法未知时抛出一个E_WARNING 级的错误。
1.1.3 openssl_random_pseudo_bytes(int $length, bool $strong_result null)
生成一个伪随机字节串字节数由 length 参数指定。
length 所需字符串长度。
strong_result 是否使用强加密。
1.1.4 openssl_encrypt()
以指定的方式和 key 加密数据返回原始或 base64 编码后的字符串。返回字符串或布尔值。
参数列表
$data 待加密明文数据$cipher_algo 加密学方式。openssl_get_cipher_methods()中内容。$passphrase 口令。若 passphrase 比预期长度短将静默用 NUL 填充 若比预期长度更长将静默截断。$options 值可为OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING根据标记按位或。options默认为0。$iv 非 NULL 的初始化向量。 默认为。$tag 使用 AEAD 密码模式GCM 或 CCM时传引用的验证标签。默认为NULL。$aad 附加的验证数据。 默认为。$tag_length 验证 tag 的长度。GCM 模式时它的范围是 4 到 16。默认16。
没查到OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING对应信息测试结果 OPENSSL_RAW_DATA1OPENSSL_ZERO_PADDING2。
var_dump(OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING);#测试结果
int(1)
int(2)
1.1.5 openssl_decrypt()
采用原始或base64编码的字符串并使用给定的方法和密钥对其进行解密。
参数中没有$tag_length其余参数顺序和说明与openssl_encrypt()相同。 $plaintext message to be encrypted;$aad time();$passphrase lsswear . $aad;$options 0;$cipher aes-128-gcm;if (in_array($cipher, openssl_get_cipher_methods())) {$ivlen openssl_cipher_iv_length($cipher);var_dump($ivlen);$iv openssl_random_pseudo_bytes($ivlen, $strong_result);var_dump($iv, $strong_result);$ciphertext openssl_encrypt($plaintext, $cipher, $passphrase, $options, $iv, $tag, $aad, 10);var_dump($ciphertext, $tag);$original_plaintext openssl_decrypt($ciphertext, $cipher, $passphrase, $options, $iv, $tag, $aad);var_dump($original_plaintext);}
测试结果
string(12) Rv}]
bool(true)
string(32) 8YzjMXJ3bQBLEpEyPtS/Dgx4Y2tB8Ks
string(10) ϪL J
string(23) message to be encrypted
1.2 base64
1.2.1 base64_encode(string $string)
使用 MIME base64 对数据进行编码。string为需加密的明文。返回字符串。
1.2.2 base64_decode(string $string, bool $strict false)
对使用 MIME base64 编码的数据进行解码。
string 加密过的字符串
strict 为true 时一旦输入的数据超出了 base64 字母表将返回 false。 否则会静默丢弃无效的字符。 $plaintext message to be encrypted €;$str base64_encode($plaintext);var_dump($str);$str2 base64_decode($str);var_dump($str2);#测试结果
string(36) bWVzc2FnZSB0byBiZSBlbmNyeXB0ZWQg4oKs
string(27) message to be encrypted €
1.3 url
1.3.1 urlencode(string $string)
编码 URL 字符串。返回字符串。
1.3.2 urldecode()
解码已编码的 URL 字符串。返回解码后的字符串。
1.4 html码转义
可以处理防止注入。
1.4.1 htmlentities()
将字符转换为 HTML 转义字符。返回编码后的字符。
参数列表
$string 需转义字符。$flags int类型。掩码标记。用于设置如何处理引号、无效代码序列、使用文档的类型。默认是 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401。$encoding 字符串类型。定义转换字符时使用的编码。默认为default_charset配置选项的值。如果default_charset配置选项可能对给定的输入设置不正确则强烈建议您为代码指定正确的值$double_encode 布尔值默认true。为false时不会转换现有的 HTML 实体 默认是全部转换。
flags 可用标记
常量名描述ENT_COMPAT会转换双引号不转换单引号。ENT_QUOTES既转换双引号也转换单引号。ENT_NOQUOTES单/双引号都不转换ENT_IGNORE静默丢弃无效的代码单元序列而不是返回空字符串。 不建议使用此标记 因为它» 可能有安全影响。ENT_SUBSTITUTE替换无效的代码单元序列为 Unicode 代替符Replacement Character UFFFD (UTF-8) 或者 #xFFFD; (其他)而不是返回空字符串。ENT_DISALLOWED为文档的无效代码点替换为 Unicode 代替符Replacement Character UFFFD (UTF-8)或 #xFFFD;其他而不是把它们留在原处。 比如以下情况下就很有用要保证 XML 文档嵌入额外内容时格式合法。ENT_HTML401以 HTML 4.01 处理代码。ENT_XML1以 XML 1 处理代码。ENT_XHTML以 XHTML 处理代码。ENT_HTML5以 HTML 5 处理代码。
encoding 字符集列表
字符集别名描述ISO-8859-1ISO8859-1西欧Latin-1ISO-8859-5ISO8859-5Little used cyrillic charset (Latin/Cyrillic).ISO-8859-15ISO8859-15西欧Latin-9。增加欧元符号法语和芬兰语字母在 Latin-1(ISO-8859-1) 中缺失。UTF-8ASCII 兼容的多字节 8 位 Unicode。cp866ibm866, 866DOS 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。cp1251Windows-1251, win-1251, 1251Windows 特有的西里尔编码。本字符集在 4.3.2 版本中得到支持。cp1252Windows-1252, 1252Windows 特有的西欧编码。KOI8-Rkoi8-ru, koi8r俄语。本字符集在 4.3.2 版本中得到支持。BIG5950繁体中文主要用于中国台湾省。GB2312936简体中文中国国家标准字符集。BIG5-HKSCS繁体中文附带香港扩展的 Big5 字符集。Shift_JISSJIS, 932日语EUC-JPEUCJP日语MacRomanMac OS 使用的字符串。空字符串激活从脚本编码(Zend多字节)、default_charset和当前语言环境(参见nl_langinfo()和setlocale())中按此顺序进行检测。不推荐。
1.4.2 html_entity_decode(string $string, int $flags ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding null)
HTML 转义字符解码。参数意义和htmlentities()相同。返回解码后的字符串 $url https://mp.csdn.net/mp_blog/creation/editor/135825528;$str1 urlencode($url);var_dump($str1);$str2 urldecode($str1);var_dump($str2);$html b测试href src . $str1 . /b;var_dump($html);$flags ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5;$encoding cp866;$hstr1 htmlentities($html, $flags, $encoding, false);var_dump($hstr1);$hstr2 html_entity_decode($hstr1, $flags, $encoding);var_dump($hstr2);$hstr3 htmlentities($html, $flags, $encoding);var_dump($hstr3);
测试结果
string(67) https%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528
string(53) https://mp.csdn.net/mp_blog/creation/editor/135825528
string(96) b测试href srchttps%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528/b
string(252) lt;bgt;tscy;boxvL;Lcy;shcy;pcy;KHcy;yacy;boxUL;HARDcy;lt;href srcequals;apos;httpspercnt;3Apercnt;2Fpercnt;2Fmpperiod;csdnperiod;netpercnt;2Fmplowbar;blogpercnt;2Fcreationpercnt;2Feditorpercnt;2F135825528apos;gt;lt;sol;bgt;
string(96) b测试href srchttps%3A%2F%2Fmp.csdn.net%2Fmp_blog%2Fcreation%2Feditor%2F135825528/b
string(252) lt;bgt;tscy;boxvL;Lcy;shcy;pcy;KHcy;yacy;boxUL;HARDcy;lt;href srcequals;apos;httpspercnt;3Apercnt;2Fpercnt;2Fmpperiod;csdnperiod;netpercnt;2Fmplowbar;blogpercnt;2Fcreationpercnt;2Feditorpercnt;2F135825528apos;gt;lt;sol;bgt; 经测试发现$double_encode的值对转义结果好像没有影响。
二 非对称加密
hash加密之后再写一篇文章。sha1已不再推荐使用。
2.1 openssl
openssl也有对如公钥私钥的使用。之后单写一篇文章。公钥、私钥、签名实际使用流程可参考微信支付签名。
2.1.1 openssl_sign()
生成签名。成功时返回 true 或者在失败时返回 false。
参数列表
$sign 待加密明文。$signature 加密后的字符串。$private_key 用户私钥。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。$algorithm 算法。 可以传int值或字符串。int值在Signature Algorithms中。字符串为openssl_get_md_methods()返回数组中的值。
$algorithm 可用int值
OPENSSL_ALGO_DSS1 php8可能不支持OPENSSL_ALGO_SHA11 openssl_sign() 和 openssl_verify() 函数使用的默认算法。OPENSSL_ALGO_SHA2246OPENSSL_ALGO_SHA2567OPENSSL_ALGO_SHA3848OPENSSL_ALGO_SHA5129OPENSSL_ALGO_RMD16010OPENSSL_ALGO_MD52OPENSSL_ALGO_MD43OPENSSL_ALGO_MD2 可能php8不支持
2.1.2 openssl_verify()
验证签名。如果签名正确返回 1签名错误返回 0错误时返回 -1 或 false。 参数列表
$data 签名。$signature 原始二进制字符串通过 openssl_sign() 或类似的函数生成$public_key 用户公钥。可算类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。$algorithm 算法。 可以传int值或字符串。int值在Signature Algorithms中。字符串为openssl_get_md_methods()返回数组中的值。
2.1.3 openssl_pkey_get_private()
获取私钥。成功时现在返回 OpenSSLAsymmetricKey 实例失败时返回 false。
参数列表
private_key 私钥文件路径或私钥字符串pem格式。passphrase 如果指定的密钥已被加密了(受密码保护)可选参数 passphrase 是必须要的。默认null。
2.1.4 openssl_pkey_get_public($public_key)
从证书中解析公钥。成功时返回 OpenSSLAsymmetricKey 实例错误时返回 false。
$public_key为PEM 格式的公钥可用字段类型OpenSSLAsymmetricKey|OpenSSLCertificate|array|string。
字符串pem证书文件路径或对应密钥。
对象OpenSSLAsymmetricKey|OpenSSLCertificate实例。
2.1.5 openssl_pkey_new(?array $options null)
必须安装有效的 openssl.cnf 以保证此函数正确运行即系统又openssl扩展则该函数可使用。
一般Linux系统里都有windows需要自己安装。
linux下载地址[ Downloads ] - /source/index.html
windows下载地址Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
options参数列表
options 键类型等同于 openssl.conf描述digest_algstringdefault_md摘要算法或签名哈希算法通常是 openssl_get_md_methods() 之一。x509_extensionsstringx509_extensions选择在创建 x509 证书时应该使用哪些扩展req_extensionsstringreq_extensions创建 CSR 时选择使用哪个扩展private_key_bitsintdefault_bits指定应该使用多少位来生成私钥private_key_typeintnone选择在创建 CSR 时应该使用哪些扩展。可选值有 OPENSSL_KEYTYPE_DSA、 OPENSSL_KEYTYPE_DH、 OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC。 默认值是 OPENSSL_KEYTYPE_RSA。encrypt_keyboolencrypt_key是否应该对导出的密钥带有密码短语进行加密?encrypt_key_cipherintnonecipher constants 常量之一。curve_namestringnoneopenssl_get_curve_names() 之一。configstringN/A自定义 openssl.conf 文件的路径。 ciopher常量
OPENSSL_CIPHER_RC2_400OPENSSL_CIPHER_RC2_1281OPENSSL_CIPHER_RC2_642OPENSSL_CIPHER_DES3OPENSSL_CIPHER_3DES4OPENSSL_CIPHER_AES_128_CBC5OPENSSL_CIPHER_AES_192_CBC6OPENSSL_CIPHER_AES_256_CBC7
2.1.6 openssl_get_curve_names()
获得ECC的可用曲线名称列表。有效曲线名称的 array 或者在失败时返回 false。
获取用于公钥/私钥操作的椭圆曲线密码ECC中可用曲线名称的列表。两个最广泛的标准化/支持的曲线是 prime256v1NIST P-256和 secp384r1NIST P-384。
2.1.6 openssl_pkey_export()
将 key 当作 PEM 编码字符串导出并且将之保存到output (通过引用传递的)中。成功时返回 true 或者在失败时返回 false。必须有openssl扩展。
参数列表
$key pem证书。$output 输出内容。$passphrase 保护密钥。$options 与openssl_pkey_new()的options 相同。
2.1.7 openssl_pkey_get_details(OpenSSLAsymmetricKey $key)
返回包含密钥详情的数组。成功时返回包含密钥详情的数组失败时返回 false。
$key 为openssl_pkey_new()产生的资源。
返回数组包括bits (位数)、 key表示公钥的字符串和 type密钥类型。
type包括 OPENSSL_KEYTYPE_RSA、 OPENSSL_KEYTYPE_DSA、 OPENSSL_KEYTYPE_DH、 OPENSSL_KEYTYPE_EC 或者是 -1。-1代表未知类型。
OPENSSL_KEYTYPE_RSA一个额外的键名为 rsa 的数组包含了以下密钥数据 Key说明nmodulusepublic exponentdprivate exponentpprime 1qprime 2dmp1exponent1, d mod (p-1)dmq1exponent2, d mod (q-1)iqmpcoefficient, (inverse of q) mod pOPENSSL_KEYTYPE_DSA, 一个额外的键为 dsa 的数组 包含如下的密钥数据。 Key说明pprime number (public)q160-bit subprime, q | p-1 (public)ggenerator of subgroup (public)priv_keyprivate key xpub_keypublic key y g^xOPENSSL_KEYTYPE_DH, 一个额外的键为 dh 的数组包含如下的密钥数据。 Key说明pprime number (shared)ggenerator of Z_p (shared)priv_keyprivate DH value xpub_keypublic DH value g^xOPENSSL_KEYTYPE_EC一个额外的键为 ec 的数组包含如下的密钥数据。 Key说明curve_namename of curve, see openssl_get_curve_names()curve_oidASN1 Object identifier (OID) for EC curve.xx coordinate (public)yy coordinate (public)dprivate key $res openssl_pkey_new();openssl_pkey_export($res, $private_key); //生成私钥$public_key_pem openssl_pkey_get_details($res)[key];$public_key openssl_pkey_get_public($public_key_pem);//生成公钥$msg qweqwe;openssl_sign($msg, $sign, $private_key, OPENSSL_ALGO_SHA256);$result openssl_verify($msg, $sign, $public_key, OPENSSL_ALGO_SHA256);var_dump($result);测试结果
int(1)
2.2 md5(string $string, bool $binary false)
md5加密。以 32 字符的十六进制数形式返回散列值。
如果可选的 binary 被设置为 true那么 md5 摘要将以 16 字符长度的原始二进制格式返回。
$str qwe;
$str1 md5($str);
$str2 md5($str, true);
var_dump($str1, $str2);#测试结果
string(32) 76d80224611fc919a5d54f0ff9fba446
string(16) v$aOF
2.3 crypt(string $string, string $salt)
单向字符串散列。此函数还不能安全地适用于二进制对象返回基于标准 UNIX DES 算法或替代算法的散列字符串。
php8之前$salt可选php8之后必填。不设置$salt会创建弱散列既设置$salt安全性更高。为了更好的安全性请确保指定足够强度的盐值。
password_hash()是crypt() 的简单封装。password_verify()可使用crypt()加密的值。
散列类型由盐值参数触发。如果没有提供盐值PHP 将自动生成一个 2 个字符DES或者 12 个字符MD5的盐值 这取决于 MD5 crypt() 的可用性。PHP 设置了名为 CRYPT_SALT_LENGTH 的常量用来表示可用散列允许的最长有效盐值。
支持以下散列类型
CRYPT_STD_DES - 基于标准 DES 算法的散列使用 ./0-9A-Za-z 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。“sale” 为 9 个字符的字符串由 1 个下划线后面跟着4个字符循环次数和4个字符盐值组成。这些 4个字符字符串都编码为 24 字节最低有效位在前。值 0 到 63 被编码为 ./0-9A-Za-z。在盐值中使用非法的字符将导致 crypt() 失败。CRYPT_MD5 - MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。CRYPT_BLOWFISH - Blowfish 散列使用如下盐值“$2a$”、“$2x$” 或 “$2y$”两位 cost 参数“$” 以及 22 位由 “./0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数它的范围是 04-31超出这个范围将导致 crypt() 失败。 “$2x$” 可能很弱“$2x$” 散列对其兼容并增强安全性。对于新的散列应该使用“$2y$”。CRYPT_SHA256 - SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “roundsN$” 开头N 的数字值将被用来指定散列循环的执行次数这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000最小是 1000最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。CRYPT_SHA512 - SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “roundsN$” 开头N 的数字值将被用来指定散列循环的执行次数这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000最小是 1000最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。 $str qwe;$salt [];$salt[1] Ab;$salt[2] _0001qwea;$salt[3] $1$123456789;$salt[4] $2y$;$salt[5] $5$qweqweqwe1234;$salt[6] rounds200$qweqwe;$salt[7] $6$asdasdasd1234;$salt[8] rounds300$;foreach ($salt as $key $value) {$str1 crypt($str, $value);var_dump($value . —————— . $str1);$result password_verify($str, $str1);var_dump($result);} 测试结果
string(33) Ab——————Ab/ILIFe8a.Hs
bool(true)
string(47) _0001qwea——————_0001qweaWSalSujA21g
bool(true)
string(64) $1$123456789——————$1$12345678$cUfiadV.wKBZVZPHNWyu.1
bool(true)
string(24) $2y$——————*0
bool(false)
string(94) $5$qweqweqwe1234——————$5$qweqweqwe1234$gx1my2HVZe1zw03lEcrklQ30A2aeS5UdDhw1hRV5IC/
bool(true)
string(48) rounds200$qweqwe——————roDektsuRs4PI
bool(true)
string(137) $6$asdasdasd1234——————$6$asdasdasd1234$P8w7i6FURNeU2yqsepHrNZtpS20HQkGqtIjR9tjSkBQPIBAuTUzpAId1kqJu9ohR3jfiZK28DsSndLzUaL4be1
bool(true)
string(42) rounds300$——————roDektsuRs4PI
bool(true) 1.4 password
1.4.1 password_hash(string $password, string|int|null $algo, array $options [])
密码加密。返回字符串。
$algo 在散列密码时指示算法的密码算法常量
$options 一个包含有选项的关联数组。
每个算法常量使用的选项数组不同参考PHP: 预定义常量 - Manual。
1.4.2 password_verify(string $password, string $hash)
密码验证。验证$password和散列值$hash是否相符。
password_hash()中以PASSWORD_BCRYPT为例。修改cost参数好像是修改crypt()中 CRYPT_BLOWFISH中cost的值必须是两位数字。 $str qweasd;$options [cost 12,];$str1 password_hash($str, PASSWORD_BCRYPT, $options);var_dump($str1);$result password_verify($str, $str1);var_dump($result);#测试结果
string(60) $2y$12$CaacB/2Q5U3mexNr9rB0yOxSDdlPTK758wQqIBl9vgTMsryeqCGyq
bool(true)
三 字符集转换 iconv
需要安装扩展iconv。php -m 可以查询。
3.1 iconv_set_encoding(string $type,string $encoding)
为字符编码转换设定当前设置。
type 可以为input_encoding、output_encoding、internal_encoding。
encoding 字符集。
经过文档查询iconv.input_encoding、iconv.output_encoding、iconv.internal_encoding已自 PHP 5.6.0 起废弃。强烈建议不要使用本特性。
所以这个函数做好不要使用。
本地测试环境php8提示Deprecated信息。
3.2 iconv_get_encoding(string $type all)
获取 iconv 扩展的内部配置变量。
type值可以是all、input_encoding、output_encoding、internal_encoding。 $info iconv_get_encoding();
var_dump($info);
$info iconv_get_encoding(input_encoding);
var_dump($info); 测试结果 array(3) {[input_encoding]string(5) UTF-8[output_encoding]string(5) UTF-8[internal_encoding]string(5) UTF-8
}
string(5) UTF-8 3.3 iconv_mime_encode(string $field_name, string $field_value, array $options [])
field_name 字段名field_value 字段值。返回字符串或布尔值。
options:
scheme 指定编码方式。B代表base64,Q引号可打印的编码方案。input-charset 默认iconv.internal_encodingoutput-charset 默认 iconv.internal_encodingline-length 指定标题行的最大长度。以防产生的报头字段比该参数的值长。如果没有给出长度将限制为76个字符。line-break-chars 设置拆包字符。粘包处理用。
3.4 iconv_mime_decode(string $string, int $mode 0, ?string $encoding null)
解码一个MIME头字段。返回字符串或布尔值。
string 编码头
model 模式。可选值ICONV_MIME_DECODE_STRICT、ICONV_MIME_DECODE_CONTINUE_ON_ERROR。
ICONV_MIME_DECODE_STRICT值为1。传入的头字段将会完全一致的按照» RFC2047的标准定义被解码. 这个选项默认是禁用的,因为有很多零散的邮件用户代理商不遵守标准规范并且不生成正确的MIME头。
ICONV_MIME_DECODE_CONTINUE_ON_ERROR值为2。忽略任何错误语法,并继续处理传入的头字段。
3.5 iconv_mime_decode_headers(string $headers, int $mode 0, ?string $encoding null)
一次性解码多个 MIME 头字段。返回数组或布尔值。
model 与iconv_mime_decode()中参数说明相同。 $preferences array(input-charset ISO-8859-1,output-charset UTF-8,line-length 76,line-break-chars \n,);$preferences[scheme] Q;// This yields Subject: ?UTF-8?Q?PrC3BCfung20PrC3BCfung?$str1 iconv_mime_encode(Subject, Prüfung Prüfung, $preferences);var_dump($str1);$preferences[scheme] B;// This yields Subject: ?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc?$str2 iconv_mime_encode(Subject, Prüfung Prüfung, $preferences);var_dump($str2);$arr iconv_mime_decode($str1, 1, UTF-8);var_dump($arr);$arr iconv_mime_decode($str2, 2, ISO-8859-1);var_dump($arr);$headers [subject $str1,date iconv_mime_encode(Date, date(Y-m-d), $preferences),];$headers_str join(PHP_EOL, $headers);$headers iconv_mime_decode_headers($headers_str, 0, ISO-8859-1);var_dump($headers); 测试结果 string(60) Subject: ?UTF-8?Q?PrC383C2BCfung20PrC383C2BCfung?
string(49) Subject: ?UTF-8?B?UHLDg8K8ZnVuZyBQcsODwrxmdW5n?
string(30) Subject: Prüfung Prüfung
string(26) Subject: Prüfung Prüfung
array(2) {[Subject]string(17) Prüfung Prüfung[Date]string(10) 2024-02-02
} 3.6 iconv(string $from_encoding, string $to_encoding, string $string)
$string字符串从$from_encoding转变为$to_encoding编码。返回字符串或布尔值。 $text test €.;var_dump($text);$text2 iconv(UTF-8, ISO-8859-1//IGNORE, $text);var_dump($text2);$text3 iconv(UTF-8, ISO-8859-1//TRANSLIT, $text);var_dump($text3);$test4 iconv(ISO-8859-1, UTF-8//TRANSLIT, $text);var_dump($test4); 测试结果 string(11) test €.
string(8) test .
string(11) test EUR.
string(14) test â¬. 3.7 iconv_strlen(string $string, ?string $encoding null)
基于指定的字符集计算字符长度。
strlen()根据字节数。
mb_strlen(string $string, ?string $encoding null)根据给定的编码返回的字符数。encoding省略或是 null则使用内部字符编码。 $text qwe 123 测试 -- ;$len iconv_strlen($text, ISO-8859-1);var_dump($len);$len iconv_strlen($text, UTF-8);var_dump($len);$len iconv_strlen($text);var_dump($len);$len strlen($text);var_dump($len);$len mb_strlen($text);var_dump($len); 测试结果 int(28)
int(18)
int(18)
int(28)
int(18) 根据php 官方文档PHP: iconv_strlen - Manual
其长度和指定编码有关所以和strlen()长度不一定一样。但是和mb_strlen()相比从测试结果上看效果一样。