代码页65001和UTF-8是相同的吗?

66
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!--#include file="conn.asp"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

上面的代码是否正确?

4个回答

74

是的。

在Windows中,UTF-8被称为CP65001(这只是一种在遗留代码页中指定UTF-8的方式)。据我所知,只要以这种方式指定,ASP就可以处理UTF-8。


17
历史上的文本文件有一个“代码页”,用于指定使用哪个字符集。这些数字因供应商而异,Windows似乎使用一个16位无符号整数来表示。现在,大多数编码和字符集都有名称而不是数字。我认为UTF-8拥有一个代码页号码(该号码在微软以外没有规定或使用),是为了确保它仍然能够与旧的16位整数代码页系统兼容。尽管UTF-8本质上并不像代码页。 - Joey
2
它只是为了与以前和现有系统的正确互操作性而存在。如今,我猜这样的机制会使用名称而不是任意数字,仅因为自1980年以来编码环境已经有所改变。 - Joey
3
Sabuncu说,(a)“DOS”这个词对于Windows控制台来说是一个误称,不要使用它。(b)把控制台窗口切换到TrueType字体,你就能够获得Unicode支持而无需经历所有的疯狂。无论你使用chcp设置何种字符集,都不会影响文本输出。此外,这个问题与Windows控制台没有任何关系,而是关于ASP的。 - Joey
1
@AnthonyWJones http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd317756.aspx - 请查看微软员工发表的第二条评论。 虽然我同意代码页会随着Windows的存在而存在,但它们仍被称为遗留问题。就像8.3名称、260字母路径等一样。 - Arioch 'The
1
CP 65001支持在cmd.exe和MS VC Runtime中存在缺陷,但作为一种编码方式来读取裸的winapi文件,似乎还可以。 - ivan_pozdeev
显示剩余4条评论

12

你的代码是正确的,虽然我更喜欢在代码中设置CharSet而不是使用meta标签:

<% Response.CharSet = "UTF-8" %>
代码页65001确实指的是UTF-8字符集。如果ASP页面(和任何包含的文件)包含标准ASCII字符集之外的任何字符,您需要确保将它们保存为UTF-8格式。通过在<%@ block>中指定CODEPAGE属性,您正在指示使用Response.Write编写的任何内容都应该被编码为指定的代码页,本例中是65001(utf-8)。请注意,这不会影响以原样发送到响应的纯静态内容。因此,需要根据指定的代码页实际保存文件。响应的CharSet属性设置Content-Type标头的CharSet值。这对如何对内容进行编码没有影响,只是告诉客户端正在接收的编码方式。同样重要的是,此值与实际发送的编码方式匹配。

1
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> 的主要意义和效果是源文件编码为 UTF-8(或指定的代码页)。它仅级联到 Response.CharSet 属性。您可以将文件保存为 UTF-8,并放置匹配的 CODEPAGE 声明,然后仍然可以使用另一种编码来进行 Response.CharSet。例如,源文件使用 65001 编码,输出使用 1251 或 1252 编码。你可能已经知道这一点,我只是觉得从你的文本中并不完全清楚,因为它开始暗示它们可能是简单的替代方案。 - Lumi
2
@Lumi:我没有发现这样的暗示,我引用了“响应的CharSet属性设置Content-Type头的CharSet值。这对内容如何编码__没有__影响。” 对我来说似乎非常清楚。另外,CODEPAGE指令的__实际__作用仅是设置Response.CodePage,开发人员有责任确保文件使用匹配的代码页保存。 - AnthonyWJones
1
你是对的。我混淆了 Response.CharSetResponse.CodePage。将 CODEPAGE 指令设置级联到后者,而不是前者;它与 Content-Type 标头毫无关系。我认为最好将 CODEPAGE 指令理解为“源文件编码”。这是一个需要注意的示例。 至关重要的表达式是 domXml.createElement("Französisch")。该文件以 UTF-8 编码(必须使用 Unicode 才能支持所有希腊、俄罗斯等字符)进行编码,因此 codepage=65001 是至关重要的。 - Lumi

10

是的,65001是Windows中UTF-8的代码页标识符,如Microsoft网站所述。维基百科建议IBM代码页128和SAP代码页4110也是UTF-8的指示器。


1
今天的链接是https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers。 - Alessandro Jacopson

1
response.codepage = 65001

当物理文件保存为UTF-8时,似乎会产生错误的结果。

否则,它将按预期工作。


1
你如何使用UTF8来修复这个问题? - toxicate20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接