Сгенерить на LS файл .csv с универсальной кодировкой для WEB

  • Автор темы Автор темы NetWood
  • Дата начала Дата начала

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Генерю для WEB на LS нехитрый файл .csv вот таким скриптом. Он потом вкладывается в док и открывается по ссылке.
Код:
Sub CreateFieldFileCSV (view As Notesview, SessionID As String, FileName As String, dt As String , filecodepage As String )
    
    Dim fileNum As Integer
    Dim entry As NotesViewEntry   
    Dim vc As NotesViewEntryCollection
    Dim doc As NotesDocument
    Dim rowstring As String   
    Dim cns As String
    
    fileNum% = Freefile()
    If filecodepage="UTF-8" Then
        Open filename For Output As fileNum% Charset="UTF-8"  ''вариант UTF-8. для Apple, но открывается на компе с кракозябами
    Else
        Open filename For Output As fileNum%   ''вариант WIN. для WIN def/ Открывается на компе без кракозяб
    End If   
    
    Print #fileNum%, "Запрос "+dt   
    Print #fileNum%, "Артикул;Наименование;Количество;Упаковка;Запрос"
    
     ' now get and print the values for each row and column
    Set vc = view.GetAllEntriesByKey(SessionID, True)    ' коллекшон сортированный по view           
    Set entry = vc.GetFirstEntry()
    While Not entry Is Nothing
        Set doc = entry.Document
        rowstring = Cstr(doc.CatalogNumber(0))+";"+Cstr(doc.Title(0))+";"+Cstr(doc.Attribute(0))+";"+Cstr(doc.Packing(0))+";"+Cstr(doc.Qty(0))
        Print #fileNum%, rowstring
        Set entry = vc.GetNextEntry(entry)
    Wend
    Close fileNum%
    
    
End Sub

перед ним пытаюсь определить браузер
Код:
useragent$    = ctx.HTTP_User_Agent(0) ''

                If Instr( useragent$ , "Apple") >0 Then                   

                    filecodepage = "UTF-8" ''для Apple, иначе на мобильных кракозябы

                Else

                    filecodepage = "" ''для WIN default, но на яблоке кракозябы

                End If

Но все равно беда. Описание:
  • На APPLE такое открывается без кракозяб
  • На XP+EXCEL 2003 открывается ок
  • На семерке 64 при любом варианте кракозябы
  • На китайском ондроеде кракозябы, но на самсунге все ок.

Вопрос. Как победить кодировку файла раз и навсегда. Кодировка сервера UTF-8 для веба.
 
@NetWood унутре файла-то получается ЮТФ-8?
и у браузера может быть выставлена принудительно кодировка (или автоматическое определение работает неправльно)
а вот сервер должен в заголовках указывать свою кодировку при отдаче файла (надо смотреть заголовки в браузере)
в отладке страницы ФФ (например) посмотреть
26559

в агенте возвращающем текст д.б. типа Print "Content-type: text/csv; charset=utf-8"
 
Последнее редактирование:
А вот как раз если выставить UTF-8 для всего - то кракозыбы на винде.

С учетом того что и в семере хром определяется как mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/72.0.3626.119 safari/537.36
пока заткнулось так
Код:
                If  (Instr(useragent$, "Safari") >0) And (Instr(useragent$, "Win") = 0)  Then      
                    filecodepage = "UTF-8" ''для Apple, иначе на мобильных кракозябы
                Else
                    filecodepage = "" ''для WIN default, но на яблоке кракозябы
                End If

То есть для основной массы браузеров работает нормально
Open filename For Output As fileNum%
а для яблоков надо отдельное приглашение
Open filename For Output As fileNum% Charset="UTF-8", но при этом открывается в excel с кракозябами если достать его из базы.


Но это же сюр!

в отладке страницы ФФ (например) посмотреть
не нашел где это. перекопал фф.
все страницы <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

Настройки сервера
26565


псыпсы:
Похоже что Open filename For Output As fileNum% без параметра генерит файл в кодировке платформы на которой стоит Domino. Так как все хозяйство работает на Win, то и default filecodepage = "Windows-1251"
Ну залепил два файла в двух кодировках для эппла и один для винды.

Но это же снова сюр!

и на эту тему страдающих полно:
 
Последнее редактирование:
Похоже что Open filename For Output As fileNum% без параметра генерит файл в кодировке платформы на которой стоит Domino. Так как все хозяйство работает на Win, то и default filecodepage = "Windows-1251"
это всегда так было, и присутствие 1251 - нонсенс, он покрывает только англицкий+русский, что никак не хорошо, костыльное наследие винды
для всех нужно ЮТФ-8 (как наиболее распространенной, хотя и там есть особенности с азиатскими письменами)
не нашел где это. перекопал фф.
Ф12 сеть, на любом запросе, посмотреть заголовки ответа
26598

и для файлов я не знаю - что будет выставлять домина, будучи на винде
 
Последнее редактирование:
  • Нравится
Реакции: NetWood
и для файлов я не знаю - что будет выставлять домина, будучи на винде
Вот она и выставляет win1251. Так что универсальное решение для .csv — генерить два файла, ибо юзера воспринимают кракозябы как ошибки и потом мучаются.
 
Вот она и выставляет win1251. Так что универсальное решение для .csv — генерить два файла, ибо юзера воспринимают кракозябы как ошибки и потом мучаются.
виндятка вроди как может в ЮТФ-8, только в ответе от сервера это надо прописывать, именно для возвращаемого файла
и принтовать его построчно
 
  • Нравится
Реакции: Vertigo
Код:
%REM
    Agent getCSV
    Created Feb 26, 2019 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Agent
%END REM
Option Public
Option Declare
Use "ErrorHandlingLS"
Sub Initialize
    On Error GoTo ErrH
    GoTo Begin
ErrH:
    Dim s As String
    s=RaiseError
    Print s
    Exit Sub
Begin:
    Dim filename As String
    filename={test.csv}
    Print "Content-type: text/csv; charset=utf-8"
    Print {Content-Disposition: attachment; filename="} & filename & {"}
    Print {my super; puper; csv file}
 
End Sub
пример агента на LS выдаст файл, с нужным именем для сохранения
вызов как обычно:http://имярек-сервер/путь_к_базе.nsf/getCSV
для бинарных данных кодировка не нужна и подойдет просто файл из БД, для чего-то более вымудренного - сервлет
результат будет выглядеть так:
26632

26631
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!