Классический ASP: Как записать строковые данные Unicode в классическом ASP? - PullRequest
13 голосов
/ 06 декабря 2009

Как мне показать столбец nvarchar, в котором хранятся данные Unicode (введенные шрифтом zawgyi1) на классической веб-странице ASP?

Когда я получаю и записываю значение на страницу, отображается «?????». Я установил тип содержимого своей страницы ASP UTF-8 с помощью следующего метатега:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

К сожалению, текст по-прежнему отображается как "?????".

Какие-либо предложения или идеи о том, как отображать значения Unicode на классической странице ASP?

Ответы [ 3 ]

16 голосов
/ 07 декабря 2009

Мета-заголовок Content-Type информирует браузер о том, что контент следует отправлять как поток текста в кодировке UTF-8. Это не гарантирует, что отправленный поток на самом деле является UTF-8. Для правильной работы с UTF-8 вам нужно сделать 3 вещи: -

  1. Убедитесь, что статический контент сохранен в кодировке, совместимой с UTF-8.
  2. Убедитесь, что ваш динамический контент закодирован в UTF-8.
  3. Сообщите клиенту, что содержимое имеет кодировку UTF-8.

Элемент 1 требует либо фактического сохранения файла ASP в виде файла в кодировке UTF-8, либо чтобы все ваше статическое содержимое в файле находилось в диапазоне символов ASCII (0-127). Обратите внимание, что если вы сохраняете как UTF-8, тогда весь ваш серверный скрипт должен использовать символы в пределах диапазона символов ASCII. В Visual Studio вы можете сделать это, сохранив файл AS ..., а затем щелкнув маленькую стрелку на кнопке Сохранить.

Элемент 2 требует, чтобы свойство Response.CodePage было установлено на кодовую страницу UTF-8 65001, это можно сделать в коде или добавив атрибут CODEPAGE=65001 в объявления <%@ %> в первая строка файла ASP. Если вы делаете это в коде, вы должны установить его перед любыми вызовами на Response.Write. И: не используйте функции chr или asc (они ошибочны при использовании 65001), но вместо этого используйте chrw и ascw.

Элемент 3 требует, чтобы заголовок Content-Type содержал квалификатор charset=UTF-8. Как вы уже делаете, вы можете сделать это с помощью заголовка META. Лично я считаю, что это немного клудж, я предпочитаю использовать Response.Charset = "UTF-8" в коде. Это помещает квалификатор в истинный заголовок HTTP Content-Type.

15 голосов
/ 06 декабря 2009

Как насчет определения вашей кодовой страницы вверху страницы?

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
0 голосов
/ 13 февраля 2015

Вот полезный скрипт для пакетного преобразования файлов ASP из кодировки ANSI в кодировку UTF-8:

<HTML>
<HEAD>
<TITLE>ASP UTF-8 Converter - TFI 13/02/2015</TITLE>
</HEAD>
<BODY style='font-face:arial;font-size:11px'>
<%
Dim fso, folder, files, NewsFile, sFolder, objFSO, strFileIn, strFileOut
Set fso = CreateObject("Scripting.FileSystemObject")
sFolder = "C:\inetpub\wwwroot\sitefolder"

Function ANSItoUTF8( ANSIFile)
   UFT8FileOut=ANSIFile&".utf8" 
   Set oFS    = CreateObject( "Scripting.FileSystemObject" )
   Set oFrom  = CreateObject( "ADODB.Stream" )
   sFFSpec    = oFS.GetAbsolutePathName(ANSIFile)
   Set oTo    = CreateObject( "ADODB.Stream" )
   sTFSpec    = oFS.GetAbsolutePathName(UFT8FileOut)
   oFrom.Type    = 2 'adTypeText
   oFrom.Charset = "Windows-1252"
   oFrom.Open
   oFrom.LoadFromFile sFFSpec
   oTo.Type    = 2 'adTypeText
   oTo.Charset = "utf-8"
   oTo.Open
   oTo.WriteText oFrom.ReadText
   oTo.SaveToFile sTFSpec,2
   oFrom.Close
   oTo.Close
   oFS.DeleteFile sFFSpec
   oFS.MoveFile sTFSpec,sFFSpec
End Function

ConvertFiles fso.GetFolder(sFolder), True

Function ConvertFiles(objFolder, bRecursive)
    Dim objFile, objSubFolder
    For each objFile in objFolder.Files
        If Ucase(fso.GetExtensionName(objFile)) = "ASP" Then
            ANSItoUTF8 objFile.path
            response.write "&bull; Converted <B>"&fso.GetAbsolutePathName(objFile)&"</B> from ANSI to UTF-8<BR>"
        End If
    Next

    If bRecursive = true then
        For each objSubFolder in objFolder.Subfolders
            ConvertFiles objSubFolder, true
        Next
    End If
End Function

%>
</BODY>
</HTML>
...