私人论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1680|回复: 2

字符串与unicode

[复制链接]

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
发表于 2018-6-2 16:19:08 | 显示全部楼层 |阅读模式
HTML 里
可以用 Unicode 码位的十进制 &#XXXX; 表示字符;
可以用 Unicode 码位的十六进制 &#xXXXX; 表示字符。
支持 Unicode 全部字符。

Javascript 里\XXX 格式是由从 0 到 377 最多三位八进制数 XXX 表示的 Latin-1 字符;
\xXX 格式是由从 00 到 FF 的两位十六进制数字 XX 表示的 Latin-1 字符;
\uXXXX 格式是由从 0000 到 FFFF 的四位十六进制数字 XXXX 表示的 UCS-2 字符;
\u{XXXXXX} 的格式由从 0 到 10FFFF 的十六进制数字 XXXX 表示的 Unicode 字符。
Javascript 内部使用 UCS-2 字符集,类似 UTF-16,但会将一个 4 字节字符识别为两个 2 字节字符;
'你好'.charCodeAt(0) 可获得字符的 UCS-2 码位数字;
'你好'.codePointAt(0) 可获得字符的 Unicode 码位数字,但其参数仍然表示 UCS-2 字符序号,一个办法是使用for...of循环,因为它会正确识别 UCS-2 字符集中的 4 字节字符;
String.fromCharCode() 方法,用于从 UCS-2 码点返回对应字符;
String.fromCodePoint() 方法,用于从 Unicode 码点返回对应字符,有多个参数时,则它们会被合并成一个字符串返回;
'你好'.charAt()方法,返回 UCS-2 字符串给定位置的字符;

PHP 里
PHP 并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码。
默认 PHP 脚本文件以 UTF-8 方式编码;
MySQL 通常(2018年)以 utf8_general_ci 编码,最大支持 3 字节,可将大于 3 字节的字符[删除]拆分为两个 UTF-16 代理字符(不行)[/删除]转换为 HTML 实体字符。使用 chr() 函数将 ASCII 码点返回字符,使用下面的代码可将 UTF-8 字符串转为 Unicode 码位的16进制表示字符串:
  1. unpack('H*', mb_convert_encoding($z,'UTF-32','UTF-8'))
复制代码

逆运算为:
  1. mb_convert_encoding( pack('H*', str_pad($h, 8, '0', STR_PAD_LEFT) ) ,'UTF-8','UTF-32');
复制代码

与之相关的还有正则表达式。
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2018-8-9 09:51:23 | 显示全部楼层
正则表达式

星号有最高优先级,接着是串接,接着是并集;a|(b(c*)) 可以写为 a|bc*
aa* 可以被表达为 a+;(a|ε) 可以被表达为 a?

竖线|代表选择(即或集),具有最低优先级。例如 gray|grey 可以匹配 grey 或 gray。

某个字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括+、?和*(不加数量限定则代表出现一次且仅出现一次):
加号 + 代表前面的字符必须至少出现一次。(1次或多次)。例如,goo+gle 可以匹配 google、gooogle、goooogle 等;
问号 ? 代表前面的字符最多只可以出现一次。(0次或1次)。例如,colou?r 可以匹配 color 或者 colour;
星号 * 代表前面的字符可以不出现,也可以出现一次或者多次。(0次、1次或多次)。例如,0*42 可以匹配 42、042、0042、00042 等。

圆括号 () 可以用来定义操作符的范围和优先度。例如,gr(a|e)y 等价于 gray|grey,(grand)?father 匹配 father 和 grandfather。

^开始,结束$

当 ? 字符紧跟在任何一个其他重复修饰符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串。

. 匹配除“\r”“\n”之外的任何单个字符。要匹配包括“\r”“\n”在内的任何字符,请使用像“(.|\r|\n)”的模式。

(?:pattern) 匹配pattern但不获取匹配的子字符串(shy groups),也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern) 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern) 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

x|y 没有包围在()里,其范围是整个正则表达式。例如,“z|food”能匹配“z”或“food”。“(?:z|f)ood”则匹配“zood”或“food”。

[xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位(或末尾)则仅作为普通字符。右方括号应转义出现,也可以作为首位字符出现。

[^xyz] 排除型字符集合(negated character classes)。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。

[^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。注意Unicode正则表达式会匹配全角数字字符。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。注意Unicode正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。注意Unicode正则表达式会匹配中文字符。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\ck 匹配控制转义字符。k代表一个字符。等价于“Ctrl-k”。用于ECMA语法。
\xnn 十六进制转义字符序列。匹配两个十六进制数字nn表示的字符。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
\num 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的捕捉群(capture group)子表达式(subexpression)匹配。其中num是从1开始的十进制正整数,其上限可能是9[注 2]、31[注 3]、99甚至无限[注 4]。例如:“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 3位八进制数字,标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un Unicode转义字符序列。其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

[:name:] 增加命名字符类(named character class)[注 1]中的字符到表达式。只能用于方括号表达式。
[=elt=] 增加当前locale下排序(collate)等价于字符“elt”的元素。例如,[=a=]可能会增加ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、ǎ、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、ā、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ 。只能用于方括号表达式。
[.elt.] 增加排序元素(collation element)elt到表达式中。这是因为某些排序元素由多个字符组成。例如,29个字母表的西班牙语, "CH"作为单个字母排在字母C之后,因此会产生如此排序“cinco, credo, chispa”。只能用于方括号表达式。


优先权
最高        \
高        ()、(?:)、(?=)、[]
中        *、+、?、{n}、{n,}、{n,m}
低        ^、$、中介字符
次最低        串接,即相邻字符连接在一起
最低        |

-----------
php 中 preg_split('/(?<!^)(?!$)/u', $string ) 这个正则能够split多字节字符,但是注意首先要将 $string 里两端的 \n 去掉。


匹配不包含mp4的行:^((?!mp4).)*$
回复

使用道具 举报

156

主题

303

帖子

1664

积分

新手上路

Rank: 1

积分
1664
 楼主| 发表于 2021-11-5 16:38:32 | 显示全部楼层
转义函数

1.转义引号
php: addslashes() stripslashes()

2.转义网址

js: encodeURI() decodeURI()
编码整个URL

js: encodeURIComponent()  decodeURIComponent()
php: rawurlencode()  rawurldecode()
编码url的一部分

3.转义 HTML
php转义实体: htmlspecialchars() htmlspecialchars_decode()
php转义换行: nl2br()

4.转义正则
php: preg_quote()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人论坛

GMT+8, 2026-2-20 10:05 , Processed in 0.052412 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表