相关疑难解决方法(0)

我在PHP应用程序中正确支持UTF-8吗?

我想确保我所知道的关于UTF-8的一切都是正确的.我一直试图使用UTF-8一段时间,但我不断遇到越来越多的错误和其他奇怪的事情,这使得看起来几乎不可能拥有100%的UTF-8网站.我似乎总是想念一个地方.也许这里有人可以纠正我的清单或者确定它,所以我不会错过任何重要的事情.

数据库

每个站点都必须在某处存储数据.无论您的PHP设置是什么,您还必须配置数据库.如果您无法访问配置文件,请确保在连接后立即" 设置名称'utf8' ".另外,请确保在所有表上使用utf8_ unicode_ ci.这假设MySQL是一个数据库,你必须为其他人改变.

正则表达式

我做了很多比你的普通搜索替换更复杂的正则表达式.我必须记住使用"/ u"修饰符,以便PCRE不会破坏我的字符串.然而,即便如此,显然仍然存在问题.

字符串函数

所有默认字符串函数(strlen(),strpos()等)都应该用多字节字符串函数替换,它们查看字符而不是字节.

标题 您应确保您的服务器返回正确的浏览器标题,以了解您尝试使用的字符集(就像您必须告诉MySQL).

header('Content-Type:text/html; charset = utf-8');

将正确的<meta>标记放在页眉中也是一个好主意.虽然实际的标题会覆盖它,但它们应该不同.

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

问题

我是否需要在页面加载时将我从用户代理(HTML表单和URI)收到的所有内容转换为UTF-8,或者我是否可以保留字符串/值,并且仍然可以通过这些函数运行它们而不会出现问题?

如果我确实需要将所有内容转换为UTF-8 - 那么我应该采取哪些步骤?mb_detect_encoding似乎是为此而建的,但我一直看到人们抱怨它并不总是有效.mb_check_encoding似乎也有问题从一个格式错误的字符串中告诉一个好的UTF-8字符串.

PHP是否会根据所使用的编码(如文件类型)以不同的方式将字符串存储在内存中,或者它是否仍然像常规字符串一样存储,其中某些字符的解释方式不同(例如& vs&in HTML). chazomaticus回答了这个问题:

在PHP中(无论如何最多为PHP5),字符串只是字节序列.没有与之相关的隐含或显式字符集; 这是程序员必须跟踪的东西.

如果给mb_*函数一个非UTF-8字符串会导致问题吗?

如果UTF字符串编码不正确会出错(比如正则表达式中的解析错误?)或者它只是将实体标记为坏(html)?有不正确编码的字符串是否有可能导致函数返回FALSE,因为字符串不好?

我听说你应该把你的表格标记为UTF-8(accept-charset ="UTF-8"),但我不确定它的好处是什么......?

编写UTF-16是为了解决UTF-8的限制吗?就像UTF-8用尽人物的空间一样?(Y2(UTF)K?)

功能

以下是我发现的一些自定义PHP函数,但我无法验证它们是否真正有效.也许某人有一个我可以使用的例子.首先是convertToUTF8(),然后是来自wordpress的seem_utf8.

function seems_utf8($str) {
    $length = strlen($str);
    for ($i=0; $i < $length; $i++) {
        $c = ord($str[$i]);
        if ($c < 0x80) $n = 0; …
Run Code Online (Sandbox Code Playgroud)

php unicode utf-8

40
推荐指数
2
解决办法
3314
查看次数

如何处理无效UTF-8字符的用户输入?

我正在寻找关于如何处理来自用户的无效UTF-8输入的一般策略/建议.

即使我的webapp使用UTF-8,某些用户也会输入无效字符.这会导致PHP的json_encode()中的错误,并且总体来说似乎是一个坏主意.

W3C I18N常见问题解答:多语言表格说"如果收到非UTF-8数据,则应该发回错误信息.".

  • 在几十个不同的地方,可以输入数据,这究竟应该如何实际完成?
  • 如何以有用的方式向用户呈现错误?
  • 如何暂时存储和显示错误的表单数据,以便用户不会丢失所有文本?剥掉坏人物?使用替换角色,以及如何?
  • 对于数据库中的现有数据,当检测到无效的UTF-8数据时,我是否应该尝试将其转换并保存回来(如何?utf8_encode()?mb_convert_encoding()?),或者在数据库中保持原样但是做某事(什么?)在json_encode()之前?

编辑:我非常熟悉mbstring扩展,并没有问"UTF-8如何在PHP中工作".我希望那些在实际情况下有经验的人提供建议.

EDIT2:作为解决方案的一部分,我真的很想看到一种将无效字符转换为U + FFFD 的快速方法

php encoding utf-8

37
推荐指数
1
解决办法
4万
查看次数

我可以强制Web浏览器将表单文本作为UTF8发送吗?

我想在我们的网站上标准化UTF8.我们所有的数据库和互联网资料都是UTF8.我们所有的Web服务器都在发送charset=utf-8HTTP标头.但是我发现通过将我的Firefox(视图 - >字符编码)中的编码更改为其他内容,我可以将拉丁字符9字符输入到表单中,PHP只会将它们视为格式错误的UTF8.

我要担心多少钱?用户的Web浏览器是否可以覆盖UTF8字符集标头并发送非UTF8?

更新:有几个人建议accept-charset个人表格.但是,我宁愿不必更改每个Web表单.假设我可以控制HTTP内容类型标头,并将其设置为UTF8,我有什么需要担心的吗?

html browser utf-8 character-encoding

15
推荐指数
2
解决办法
7138
查看次数

在表单中使用时,accept-charset ="UTF-8"参数不会执行任何操作

我在表单中使用accept-charset ="utf-8"属性,发现在使用非ascii进行表单发布时,标头在请求标头中有不同的accept charset选项.有什么我想念的吗?我的表格看起来像这样

<form method="post" action="controller" accept-charset="UTF-8">
..input text box
.. submit button
</form>
Run Code Online (Sandbox Code Playgroud)

提前致谢

html forms encoding freemarker spring-mvc

8
推荐指数
1
解决办法
3万
查看次数

JSP没有为HTML表单POST显示正确的UTF-8内容

我正在将Java 11与带有最新JSP / JSTL的Tomcat 9配合使用。我正在Windows 10的Chrome 71和Firefox 64.0中进行测试。我有以下测试文档:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en-US">
<head>
  <meta charset="UTF-8"/>
  <title>Hello</title>
</head>
<body>
  <c:if test="${not empty param.fullName}">
    <p>Hello, ${param.fullName}.</p>
  </c:if>

  <form>
    <div>
      <label>Full name: <input name="fullName" /></label>
    </div>
    <button>Say Hello</button>
  </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这也许是最简单的形式。如您所知,表单method默认为get,表单action默认为""(提交到同一页面),表单enctype默认为application/x-www-form-urlencoded

如果我在字段中输入名称“FlávioJosé”(巴西著名的法罗歌手和音乐家)并提交,则通过将该表单通过HTTP提交GET到同一页面hello.jsp?fullName=Fl%C3%A1vio+Jos%C3%A9。这是正确的,并且页面上显示:

Hello, Flávio José.
Run Code Online (Sandbox Code Playgroud)

如果将表单更改methodpost并输入相同的名称“FlávioJosé”,则表单内容将通过提交POST,并带有HTTP请求内容:

fullName=Fl%C3%A1vio+Jos%C3%A9
Run Code Online (Sandbox Code Playgroud)

这似乎也是正确的。但是这次页面显示:

Hello, Flávio …
Run Code Online (Sandbox Code Playgroud)

java forms jsp tomcat servlets

5
推荐指数
1
解决办法
367
查看次数