EF BB BF

EF BB BF
Unicode签名BOM(Byte Order Mark)


近日在调测一个UTF8编码的中文Zen Cart网站时遇到一件怪事,网页显示文字正常,用ie的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。经在网上多方查证和多次测 试,解决了这个问题,其实是UTF-8文件的Unicode签名BOM(Byte Order Mark)问题。

BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测, 而把它当作正常字符处理。

微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

也 就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

我找到Zen Cart的模版文件中的html_header.php,发现文件果然不带BOM,用UltraEdit-32另存为的方式加上BOM后,再上传html_header.php,一切正常。

注 意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。

另 外还学到一些编码的小知识:所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传 输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是一些旧的系统和库函数不能正确处理utf-16而被迫出来的,而且对英语字符来说, 也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它 字符的时候,utf-8会使用两个或三个字节

### 动态规划中最短路径算法的递推公式 动态规划用于解决最短路径问题的核心在于通过状态转移方程来逐步构建最优解。假设存在一个加权图 \( G=(V,E) \),其中 \( V \) 是顶点集合,\( E \) 是边集合,则可以定义从顶点 \( i \) 到顶点 \( j \) 的最短路径长度。 #### 定义递推关系 设 \( D(i,j,k) \) 表示从顶点 \( i \) 到顶点 \( j \) 的最短路径长度,且这条路径只允许经过编号小于等于 \( k \) 的中间节点。那么递推公式如下: \[ D(i,j,k)=\begin{cases} w(i,j), & \text{if } k=0 \\ \min(D(i,j,k-1), D(i,k,k-1)+D(k,j,k-1)), & \text{otherwise} \end{cases} \] 这里 \( w(i,j) \) 表示直接连接顶点 \( i \) 和 \( j \) 边的权重[^4]。 #### 两种情况的推导过程 ##### 情况一:不考虑第 \( k \) 号节点作为中间节点 如果最短路径从 \( i \) 到 \( j \) 不经过任何编号大于 \( k-1 \) 的节点,则此时的状态值保持不变,即: \[ D(i,j,k) = D(i,j,k-1) \] ##### 情况二:考虑第 \( k \) 号节点作为中间节点 当最短路径可能经过编号为 \( k \) 的节点时,需要比较两条潜在路径的长度: 1. **直接路径**:从 \( i \) 到 \( j \) ,其长度由前一步的结果给出,即 \( D(i,j,k-1) \); 2. **间接路径**:先从 \( i \) 经过 \( k \) 再到达 \( j \),总长度为 \( D(i,k,k-1) + D(k,j,k-1) \)[^5]。 最终取两者较小者作为新的状态值: \[ D(i,j,k) = \min(D(i,j,k-1), D(i,k,k-1) + D(k,j,k-1)) \] 此公式的本质是利用分治的思想,在每一轮迭代中尝试加入一个新的候选中间节点,并重新评估当前已知的最佳路径。 ```python def floyd_warshall(graph): node_num = len(graph) shortest_path_matrix = [[float('inf')] * node_num for _ in range(node_num)] # 初始化距离矩阵 for i in range(node_num): for j in range(node_num): if i == j: shortest_path_matrix[i][j] = 0 elif graph[i][j]: shortest_path_matrix[i][j] = graph[i][j] # 更新距离矩阵 for k in range(node_num): for i in range(node_num): for j in range(node_num): shortest_path_matrix[i][j] = min( shortest_path_matrix[i][j], shortest_path_matrix[i][k] + shortest_path_matrix[k][j] ) return shortest_path_matrix ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值