在 ASP 和 ASP.NET 全球化问题


ASP.NET 支持语音列


若要自定义您的需求为本专栏,我们邀请您提交您有关您感兴趣的主题的意见和知识文库文章和支持语音列在将来提出想要看到的问题。您可以通过使用已为该请求表单提交自己的想法和反馈。还有一个链接到窗体中此列的底部。

简介


欢迎 !这是 Sukesh Khare 与 Microsoft ASP.NET 开发人员技术支持团队。这是我已经编写支持语音列在第一次。我期待着在未来的月份创作更多这样的列。

对于本月的专栏中,我将讨论全球化问题在 Active Server Pages (ASP) 和 ASP.NET,我们在 ASP、 如何事情变化在 ASP.NET 1x,和是怎么回事与 ASP.NET 2.0 在全球化方面面临的问题。

注意:如果您会遇到不懂的术语,请参阅此列底部的术语表部分。

在 ASP 中的全球化问题

在 ASP.NET 中之前, 开发的应用程序的全局用户没有结构化的支持。在 ASP 的早期开发,开发人员如发现自己只分散对操作系统、 浏览器、 Asp 和后端系统中的全球化支持。但是,我们很少看到任何自动连接跨这些应用程序。幸运的是,我们未了解的概念,如字符集、 代码页、 浏览器语言和字体它我们可以为全球用户的应用程序的开发利用。

它将分成类别所有全球问题见过那些人在 ASP.NET 中寸步难行。相反,我将列出一系列的有关这些问题的大量的概念。

字符集和代码页

我们都知道我们的计算机屏幕上的字符都只是一系列字节。可以创建和以任何方式被解释的字节序列。如果对解释使用不同编码的字节数组使用创建的编码,解释将显示为垃圾。(Charsets) 的字符集编码格式通常所使用的浏览器。代码页属性,该属性更适用于服务器端转换,是只带有指定的字符编码方式的转换表。

浏览器对窗体发布数据,按照当前的字符集进行编码。如果当前字符集"窗口-1256"则字节传输到服务器也被编码为"windows-1256。"

当 ASP 被被解释时,直到它们在代码中引用并非生成窗体查询字符串集合。正在生成它们,字符串数据将根据当前代码页转换为 Unicode。(默认情况下,ASP 和 ASP.NET 处理内容通过使用 Unicode 格式)。它是非常重要的您在引用集合; 之前设置正确的代码页否则,在内存中的 Unicode 表示将不会是正确的。

若要设置代码页,请使用Session.CodepageResponse.CodepageResponse.Codepage只是在 Microsoft Internet Information Services (IIS) 5.1 或更高版本中可用。(分别对应的字符集) 的整数值有关的信息,我们将设置这些属性,请访问下面的 Microsoft 网站︰例如,要设置为阿拉伯语代码页,请使用以下代码︰
Session.Codepage = 1256
Response.Codepage将只影响当前响应。不过, Session.Codepage会影响当前用户所做的所有答复。代码页使用这些属性之一设置并生成窗体查询字符串集合,在当前代码页中的此更改会导致Response.Write方法在内存中的当前代码页为 Unicode 转换。有关此主题的详细信息,请访问下面的 MSDN 网站︰
设置字符串的代码页转换 (ASP)http://msdn2.microsoft.com/en-us/library/ms525789.aspx
最重要时说到与 charsets 相关的问题和代码页是该客户端字符集服务器代码页应匹配。

接受语言

如果 ASP 开发人员想要知道哪些用户在其浏览器中设置的语言,开发人员可以使用Request.ServerVariables ("HTTP_ACCEPT_LANGUAGE")变量来查找用户想要读取响应,(如英语、 德语或印度洋) 的语言的列表和用户想要查看这些语言的首选项的顺序。在 ASP.NET 中,类似的信息是出现在Request.UserLanguages属性中作为数组。
有关如何在 ASP 代码中使用此信息的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章︰
229690如何设置每个浏览器的语言设置 ASP 区域设置 ID

在 Internet Explorer 中显示的多字节字符设置

可以显示多字节字符集的唯一编码格式是 Unicode (utf-8)。我们可以使用 utf-8,显示西里尔文、 印度洋和日语在同一页上。如果我们不使用 utf-8,我们只能显示一种语言一次。要设置浏览器的字符集,请使用Response.CharSet属性。

静态页面上的多字节字符

若要显示直接在页中存储的多字节字符,我们首先必须使用特定编码保存网页。UTF-8 将是最好的但也可以特定代码页 (到个字符的代码页匹配)。

保存 ASP 文件使用 Microsoft Visual InterDev 没有帮助,因为 Visual InterDev 只能保存在 ANSI 英语或 Unicode。保存为 Unicode 不支持 ASP 的任何 ASP 页。

在 Microsoft Visual Studio.NET 中,可以保存任何编码格式的文件。有两种方法来执行此操作。默认方式是通过用户使用当前代码页保存文件。另一种方法将文件保存为编码如下所示︰
文件菜单上,单击将文件另存为。在
将文件另存为对话框中,单击下拉箭头在上
保存按钮。当单击箭头时,选项包括
保存使用编码保存。当您单击
编码保存高级保存选项对话框中会显示在其中可以选择要应用列表中的计算机安装的代码页的编码类型。


注意:这将更改保存为编码操作,而是仅一次。下的一次保存将重新设置为默认值。

要更改默认代码页,请单击高级保存选项
文件菜单。在高级保存选项对话框中,您可以设置的默认编码保存代码页为您选择的操作。

这些方法与方式将该文件保存在磁盘上。然而,asp,如前所述,控制输出,我们需要将Session.CodePageResponse.CharSet属性设置。对于 IIS 5.1 和更高版本中,我们还可以使用Response.CodePage属性。

在服务器上的默认代码页

默认区域设置和页面的默认代码页取决于注册表设置。默认用户。我们可以找到国际密钥在注册表配置单元HKEY_USERS\。DEFAULT\Control Panel\International。我们还可以更改 iis 选择的区域设置的行为。有关详细信息,请参阅以下知识库文章中的"IIS 5.0"部分︰
306044时从 Active Server Pages 的访问行为的日期/时间格式不同

如果登录的用户具有相同的区域设置将设置为上面的项或系统的默认设置,用户设置优先。

示例︰ 默认区域设置的格式设置为 11.1.2004,同时在用户登录 (具有相同的区域设置) 都有为 2004 年 11 月 1 日的日期格式的日期。对于 ASP,2004 年 11 月 1 日设置将生效。

(对于 ASP.NET,这可以改变。在某些安装时,ASPNET 用户必须自己将下显示 HKEY_USERS 加载时的配置文件。其他情况下,它将使用。默认配置文件。我们还可以在 < %@ %> 声明中使用代码页属性。这应使用具有不同编码然后默认情况下,例如,代码页 932 (日语) 保存文件时)。

代码页问题而不是字体转换问题︰ 即它?

有时,您可能会看到一个问号 (?) 字符或存放字符应出现一个框。
代码页转换问题
当一个字符替换为问号 (?) 字符了时,这是一个代码页的转换问题,发生指示。问号 (?) 是默认字符的代码页转换,通常表示操作系统不会不知道如何处理字符值并将其转换。它将替换问号 (?) 字符值。这可能意味着字符都有代码页值无效或未安装所需转换的代码页。
字体转换问题
当一个字符被替换为框时,这是指示字体转换问题发生。这发生在客户端时客户端没有正确安装才能正确显示该字符的字体。例如,当一个字符来自日语字符集,且客户端没有安装日文字体,日文字符显示为框中。

接下来,我将谈一谈事情如何变化在 ASP.NET 1.x 中,并且这些更改将如何影响 ASP.NET 环境中的全球化问题。

全球化问题在 ASP.NET 1.x:

与 ASP.NET,引入三个好处︰
  • Web.config 文件中的 < 全球化 > 标记
    < 全球化 > 标记我们偏离不相干的代码页和 charsets 的概念,并使我们能够控制大部分在 ASP.NET 中的变量。
  • System.Globalization 命名空间
    全球化命名空间为我们提供了处理全球化的编程能力。
  • 资源文件的概念得到了显著改善。
    我们不处理我们在 ASP 中使用到的方法中的资源文件。现在,资源文件中的 XML 文件的形式是,当我们设计和开发它们,和它们是在运行时将汇编。
全球化配置标记︰

在标记中的两个重要的设置如下所示︰
<globalization             requestEncoding="utf-8" 
responseEncoding="utf-8" />
其他可能的设置领域如下所示︰
fileEncoding指定默认编码为.aspx、.asmx 和.asax 文件解析。Unicode 和 utf-8 字节顺序标记前缀 (带有签名) 与保存的文件将被自动识别, fileEncoding的值无关。
区域性指定用于处理 (适用于类的方法 System.Globalization 命名空间中) 的传入 Web 请求的默认区域性。
uiCulture指定用于处理与区域设置有关的资源搜索 (附属程序集) 的默认区域性。
有关区域性字符串 (文化uiculture值) 的详细信息,请访问下面的 Microsoft 网站︰响应是完整的之后, 和之前请求传递到您的应用程序,ASP.NET 将应用这些设置。对于 responseEncoding,为此编码设置创建用于存储输出缓冲区。所有进入此缓冲区的内容将根据设置为插入到缓冲区编码。

对于 requestEncoding,运行时将读取请求并将其解释这一节中的设置。这是造成问题,但是设置。下表显示无效的 utf-8 字节序列的位布局。

如果字符值落在标准的 ASCII 7 位,则不修改的字节值。如果值大于 127,它必须遵循下面的规则。领先组位显示序列中的字符数。第一个必须从开始的第一位后每个字节设置为 1。

Utf-8 字节布局︰
字节数表示
170vvvvvvv
211110vvvvv 10vvvvvv
3161110vvvv 10vvvvvv 10vvvvvv
42111110vvv 10vvvvvv 10vvvvvv 10vvvvvv
这是问题的来源何处。如果浏览器对单字节编码 (例如 iso-8859-1) 根据请求进行编码,编码在 127 以上的值不会有效根据上述布局。被读取到 utf-8 缓冲区后, 从输出只被除去无效的字符。

运行时编码更改

Application_BeginRequest事件中,我们可以修改的 requestEncoding 值,使其在处理请求之前生效。为响应, Page_PreRender事件是修改的编码输出的最后一次机会。此外请注意, Response.Write将字符放到缓冲区是所谓的因此请务必使用Response.Write之前,有适当的编码集。

原始数据为非 Unicode︰ 如何仍使 Internet Explorer 解释多字节 charsets?

我们还可以进行类似 ASP,如果我们需要 ASP.NET。若要使这种情况,我们需要将 responseEncoding 和 requestEncoding 为windows-1252 (更完整编码比 iso-8859-1),并使用Response.Charset属性来正确显示的文本。这样做的原因 windows-1252 是一个单字节编码方案,并且不会修改任何添加到缓冲区的字节。因此,作为一系列单个字节发送双字节字符。我们然后可以告诉 Internet Explorer 如何使用Response.Charset属性来解释字节。如果原始数据未如从 COM 对象,返回的值存储为 Unicode 或 utf-8,或者 Microsoft SQL Server (例如 varchar) 非 N 字段中的数据,这种情况下可能有必要。

SQL Server 和 ASP.NET 全球化问题

SQL Server 的 Unicode 数据输入
将数据存储在 SQL Server 的最好办法是使用 Unicode。每当我们使用插入、 更新等,如果即使没有 Unicode 数据更少的机会,我们需要添加N值之前。这会告诉数据库的值是 Unicode。一个很好的例子是 ADO 对象。他们这样做自动如果我们使用记录集对象来添加新的记录。

以下是一个示例︰
INSERT INTO MusicAlbum (Album_ID, [Year], Name, Artist_ID, Company_ID) VALUES (12345, 2005, N'Abida', 4653, 403)Or:
Dim t As String = "INSERT INTO MusicAlbum(Album_ID, [Year], Name, Artist_ID, Company_ID) VALUES (12345, 2005, N'" & TextBox1.Text & "', 4653, 403)"

SQL Server 对输入的日期/时间
通常我们会有有关的区域性和区域设置的日期/时间解释我们的 ASP.NET 应用程序内的知识。但是,同时推和拉的日期/时间数据与从外部源,我们运行日期/时间格式错误解释的风险。这是因为我们不能始终保证的区域性和区域设置是与我们的应用程序相同的外部源。在 SQL Server 中这可以解决使用当前语言中连接建立到 SQL 数据库的连接字符串属性。我们可以提供相同的语言设置在连接字符串中,是在我们的应用程序的区域性。这可以防止我们风险的错误地解释,因为 SQL Server 总是接受并同意上述设置的形式发送日期/时间数据。

System.Globalization 命名空间

此命名空间是全球化和本地化在.NET Framework 中的核心。在此命名空间中使用的主类是CultureInfo类。它包含区域性特定信息,如日期/时间格式、 数字格式、 比较信息和文本信息。CultureInfo类的更多信息,请访问下面的 MSDN 网站︰

非特定区域性和特定区域性

非特定区域性是与一种语言,但不是特定国家 / 地区关联的区域性。非特定区域性是同时使用一种语言和特定国家相关联。

示例:"DE"(非特定区域性) 的德语,但"de-AT"(特定区域性) 是德语语言因为它被说出在奥地利。非特定区域性不能用于格式设置。

当前的.NET Framework 类的线程和区域性安全意识

所有类和我们希望的输出是区域性相关.NET Framework 库中的方法都有两种内置的行为︰
  • 他们让我们时提供这些参数,以便输出取决于指定的区域性,指定的区域性代码。这是可选的。
  • 如果这错过了 (通常为),类是足够的智能化,使检查Thread.CurrentThread.CurrentCulture属性并根据它的工作。
我们可以修改此属性的值类似于下列的代码︰
    Dim ci As CultureInfo        ci = New CultureInfo("de-AT")
Thread.CurrentThread.CurrentCulture = ci
在此代码示例中,"de"表示德语,和"AT"代表奥地利。因此,在此情况下, DateTime.Now()。ToString方法将会在相应的格式返回日期和时间以在奥地利德语语言表示的日期和时间的方式。

框架 (如下) 确保CurrentCulture属性将始终初始化︰
  1. 无论它是以编程方式设置。
  2. 如果未显式设置由程序员,从配置文件中选取属性 (< 全球化 > 标记)。
  3. 如果缺少该属性,它是在其运行的 Web 服务器的区域性。这通常是与操作系统的语言相对应的非特定区域性。

资源文件

所有.resx、.resource 文件,并已设置为嵌入的资源生成操作属性添加到在 Visual Studio.NET 中,ASP.NET 项目的文件被自动编译并嵌入在应用程序程序集作为其清单的一部分。这甚至可以手动使用资源文件生成器 (RESGEN) 实用程序通过 Visual Studio.NET 命令提示符。有关详细信息,请访问下面的 MSDN 网站︰这是我们需要管理应用程序资源,并对全球化没有关系时适用一般概念。但是,当我们在实现全球化,我们应该使用附属程序集。

附属程序集

附属程序集可在 ASP.NET 项目时应确保满足下列条件︰
  1. 所有的 aspx 文件中的所有用户界面元素都需要配备 id 和 runat = 服务器属性。
  2. 我们创建单独的.resx 文件。每个必须对应于每个我们想支持我们的应用程序的区域性。
  3. 我们必须确定常见的名字,如字符串的所有这些文件。
  4. 我们命名单独的.resx 文件使用以下命名约定commonfirstname。 区域代码语言代码.resx (例如︰ Strings.de AT.resx,Strings.en-GB.resx)。
  5. 我们应将此资源文件
    commonfirstname(Strings.resx) 的.resx 具有字符串为我们希望显示默认情况下所有。
  6. 编写代码以检测用户的区域性,并设置Thread.CurrentThread.CurrentUICulture属性,以匹配它。
  7. 编写代码以通过ResourceManager类加载资源。
  8. 编写代码来加载的对象,从提取的字符串并将它们分配给用户界面元素。
当执行完这些步骤后时,可视于将编译 Strings.resx,并将其嵌入到应用程序程序集 (MyGlobalizationTestProjectName.dll)。但是,对于所有其他.resx 文件,它将生成不包含可执行代码,而只有资源数据的单独的 dll 文件。实际上,这些被称为附属程序集。此外,Visual Studio.NET 放置这些文件夹结构中与以下类似︰
MyGlobalizationTestProjectName        |------- bin
|------en-US
MyGlobalizationTestProjectName.resources.dll
|------ja-JP
MyGlobalizationTestProjectName.resources.dll
|------de-AT
MyGlobalizationTestProjectName.resources.dll

CurrentCulture 和资源之间的差异

System.Globalization命名空间中的类的方法取决于要使其输出的Thread.CurrentThread.CurrentCulture属性,尽管ResourceManager类加载的资源程序集取决于加载相应的附属程序集的Thread.CurrentThread.CurrentUICulture属性。以下是 C# 代码的示例︰
using System.Globalization;using System.Threading;
using System.Resources;

//Load resources.
protected ResourceManager gStrings = new ResourceManager("MyGlobalizationTestProjectName.strings", typeof(MyTestWebFormName).Assembly);

// Get the user's preferred language.
string sLang = Request.UserLanguages[0];
// Set the thread's culture for formatting, comparisons, etc.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(sLang);
// Set the thread's UICulture to load resources
// from satellite assembly.
Thread.CurrentThread.CurrentUICulture = new CultureInfo(sLang);

private void Page_Load(object sender, System.EventArgs e)

{

if (!IsPostBack)

{
// Get strings from resource file and assign to UI elements.
head1.InnerHtml = gStrings.GetString("satellite.head1");
p1.InnerHtml = gStrings.GetString("satellite.p1");
sp1.InnerHtml = gStrings.GetString("satellite.sp1");
sp2.InnerHtml = gStrings.GetString("satellite.sp2");
butOK.Text = gStrings.GetString("satellite.butOK");
butCancel.Value = gStrings.GetString("satellite.butCancel");
}

}

ASP.NET 在其中选择附属程序集的顺序︰

设置线程的资源时,ASP.NET 将自动选择匹配,资源顺序如下︰
  • 如果找到匹配的区域性的附属程序集,该程序集中的资源使用。
  • 如果找到匹配使用非特定区域性的附属程序集,则使用该程序集中的资源。
  • 如果使用为找不到匹配项,使用存储在可执行程序集的后备资源。
注意:这基于更多常规资源后备进程。有关详细信息,请访问下面的 MSDN 网站︰

手动创建附属程序集︰

使用附属程序集是在 Visual Studio.NET 创建程序集本身。Visual Studio.NET,默认情况下,但是没有强名称的附属程序集。如果您想要更改这些选项,您将需要手动创建附属程序集。有关详细信息,请访问下面的 MSDN 网站︰.

是怎么回事与 ASP.NET 2.0 对全球化正面?

广泛使用 ASP.NET 和的各种问题,我们将会看到关于 ASP.NET 2.0 中的全球化功能仍然是未来一定距离。然而,就最好简单看一下全球化方法向 web 应用程序的方向。

在 ASP.NET 2.0 中的全球化支持经历了根本的改变,Web 开发人员有权使 Web 应用程序的本地化一样容易,因为它是基于 Windows 的应用程序的能力。以下是基础上的全球化方法在 ASP.NET 2.0 中的功能的列表︰

强类型资源在.NET Framework 2.0 的核心发行向开发人员提供智能感知的强类型资源支持,并简化了访问资源在运行时所需的代码。

托管资源编辑器Visual Studio.NET 2.0 包括新的资源编辑器具有用于创建和管理资源条目包括字符串、 图像、 外部文件和其他复杂类型的更好的支持。

Web 窗体的资源生成Windows 窗体开发人员一直已在自动国际化的优势。Visual Studio.NET 2005年现在将自动生成 Web 窗体、 用户控件和母版页的资源来支持快速国际化。

改进的运行时支持ResourceManager 实例是由运行库托管和通过更易于编程接口的服务器代码均可访问。

本地化的表达式现代网页的声明性表达式支持映射资源项来控制属性、 HTML 属性或静态内容的区域。这些表达式也是可扩展的这提供了更多的方法来控制附加到 HTML 输出的本地化的内容的过程。

自动区域性选择管理每个 Web 请求的区域性选择可以自动链接到浏览器的首选项。

资源提供程序模型新的资源提供程序模型允许对主机资源,如平面文件和数据库表的其他数据源中的开发人员时访问这些资源的编程模型保持一致。

有关在 ASP.NET 2.0 中的全球化方法的详细信息,请访问下面的 MSDN 网站︰
ASP.NET 2.0 版的本地化功能︰ 全新的方法来对 Web 应用程序进行本地化
http://msdn2.microsoft.com/en-us/library/ms379546(VS.80).aspx

结论

这就是现在在 ASP 和 ASP.NET 全球化问题。我希望这篇文章将帮助一些客户解决在 ASP 和 ASP.NET 全球化问题之前他们选择与 Microsoft 支持部门联系。我将会考虑以下︰

"随时随地进行开发,想到数百万可以使世界各地的人。使您的解决方案全球通用的 !Microsoft 工具和技术方便国际化。"

我们会赶上下个月与另一个有趣的主题。

感谢您抽出宝贵时间。
在 ASP 和 ASP.NET 全球化问题的更多信息,请参见下面的 Microsoft 网站︰
SetLocale 和 GetLocale 在 vbscript 中
http://msdn2.microsoft.com/en-us/library/5xf99h19.aspx
转到全局︰ 对使用 IIS 5.0 和 SQL Server 的动态 Web 应用程序进行本地化
http://msdn.microsoft.com/msdnmag/issues/01/05/global/default.aspx
转到全局︰ 设计基于 ASP 的 Web 站点以支持全球化
http://msdn.microsoft.com/msdnmag/issues/0700/localize/default.aspx
315616 在 Active Server Pages 检测客户端语言如何在 IIS 中的页面
http://support.microsoft.com/?id=315616
资源和使用.NET Framework SDK 的本地化
http://msdn2.microsoft.com/en-us/library/aa309421(VS.71).aspx
设计和实施准则为 Web 客户端的全球化和本地化
http://msdn2.microsoft.com/en-us/library/ms978628.aspx
官方 Microsoft 站点 — — 全球开发和计算门户
http://msdn.microsoft.com/en-us/goglobal/bb688096
对于 ASP.NET 全球化体系结构
http://msdn2.microsoft.com/en-us/library/aa478974.aspx
企业本地化 Toolkit-开发 Microsoft ASP.NET 本地化应用程序
http://msdn2.microsoft.com/en-us/library/aa479334.aspx
839861 A System.Resources.MissingManifestResourceException 异常发生时您尝试访问已本地化的资源

术语表

ANSI美国国家标准学会的立场。在此上下文中,它表示具有特定的语言字符集转换设置的特定代码页。最常引用的英语代码页 (windows-1252)。

ASCII1 个字节 (或 7 位) 编码方案。0-127 范围内的字符被标准化。128 到 255 的范围是 ASCII,不属于标准的扩展。此示例是 OEM ASCII 图表的上限和 VB ASCII 图表之间的差异。

字符集正在设置使用主要用于 Internet Explorer 和浏览器,将告诉浏览器如何解释的字符数据。例如︰ Response.charSet ="iso-8859-1。"

代码页使用指定的字符编码方式 (通常用于服务器) 的转换表。

全球化全球化是设计和创建应用程序,这样一种文化、 区域或国家/地区和语言的需要的唯一的需求可以得到满足的过程。换句话说设计应用程序稍后本地化的方式是全球化。

区域设置中的区域性语言和地区特定的格式/首选项包括、 日期和日历格式、 时间格式、 货币格式、 大小写、 排序和字符串比较地址格式、 数字格式、 纸张大小、 度量单位,书写方向等的电话。

LocaleID (LCID)一个 DWORD 值,它指定语言标识符和分类 id。它可用于为 ex 日期/时间等应设置格式根据指定的特定区域格式。

本地化分析应用程序表示为要求语言的内容的能力。

本地化本地化是将用户界面翻译为特定的语言和/或区域设置的过程。

多字节字符集字符集中的字符所组成的两个或多个字节,如日本。Utf-8 也属于此类别。(在此类别中,从技术上讲是 Unicode,但在 Windows 中,它有其自己的类别)。

Unicode2 字节编码方案。Windows 内部使用 Unicode。专门为 Unicode 任何 Api 都表示"W"端上的函数名。也称为宽字符;不能直接用于从 web 应用程序。

UTF-8字符编码为字符可以由 1 6 个字节。在 Windows 中,范围为 1-3 个字节。不支持在 NT4 的 web 应用程序。
有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
175392 utf8 表示支持


宽字符设置Unicode 的别名。也称为 DBCS (双字节字符集),ucs-2,utf-16。
始终,尽情地提交有关主题的意见要在将来解决列或使用知识文库
窗体已对其询问