Классический ASP: Как написать строковые данные в юникоде в классическом ASP?

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

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

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

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

Любые предложения или идеи о том, как отображать значения unicode на классической странице ASP?

Ответы

Ответ 1

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

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

Ответ 2

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

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

Пункт 1 требует либо того, чтобы вы фактически сохранили файл ASP как файл с кодировкой UTF-8, либо все содержимое статического содержимого в файле находилось в диапазоне символов ASCII (0-127). Обратите внимание, что если вы сохраняете как UTF-8, то все ваши серверные script должны использовать символы в диапазоне символов 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. Лично я считаю, что, чтобы быть немного kludge, я предпочитаю использовать Response.Charset = "UTF-8" в коде. Это помещает квалификатор в истинный Content-Type HTTP-заголовок.

Ответ 3

Здесь полезный script для пакетного преобразования 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>