Кодировка при возврате строк

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
451
если к-л образом строки попадают в java извне (результат по http как пример), то кодировка платформы может не совпадать с оной в результате
кодировка нотусячего клиенте по виндовз cp1251
посмотреть можно в дебаг консоли, через "p"
Опытным путем установил что это отражается в параметре file.encoding
опыт был произведен при настройке -Dfile.encoding=UTF8 , установкой его в окружении виндовз через JAVA_TOOL_OPTIONS , в картинках это
до установки: file.encoding=Cp1251, после: file.encoding=UTF8
 
  • Нравится
Реакции: VladSh

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
451
установка среды, а заоодно и java.pol с эскалацией прав (не проверял на появление UAC, просто взял )
Код:
%REM
    Function SaveAndbRun
    Description: Comments for Function
%END REM
Function SaveAndRun(param As String)
    On Error GoTo ErrH
    GoTo Begin
ErrH:
    Error Err, RaiseError
Begin:
'Your code goes here
    Dim NDC As NotesDocumentCollection
    Set NDC=SelectedDocsUI
    Dim doc As NotesDocument
    Set doc=NDC.getFirstDocument
    If Not doc Is Nothing Then
        Dim files List As String, res As String
        res=DetachFiles(doc, {body}, {*.cmd}, files)
        Dim launch As String
        If Len(res)>0 Then
            launch=res
            res=DetachFiles(doc, {body}, param, files)
            launch=launch & { } &res
            If Len(res)>0 Then
                Print {Launch: }launch
                res=Shell({cmd.exe /C } &launch, 1)
            End If
        End If
    End If
End Function
Код:
Public Function SelectedDocsUI() As NotesDocumentCollection
    On Error Goto ErrH
    Dim uiview As NotesUIView
    Dim doc As NotesDocument, NDC As NotesDocumentCollection, NDCtmp As NotesDocumentCollection
    Set uiview=wks.CurrentView
    If Not uiview Is Nothing Then
        Set NDCtmp=uiview.Documents
        DbgMsg {Selected in view:}& Cstr(NDCtmp.Count)
        Set doc=NDCtmp.GetFirstDocument
        If doc Is Nothing Then
            Set NDC= db.CreateDocumentCollection
            Set doc=db.GetDocumentByID(uiview.CaretNoteID)
            If doc Is Nothing Then Exit Function
            Call NDC.AddDocument(doc)
            Set doc=NDC.GetFirstDocument
        Else
            Set NDC= db.CreateDocumentCollection
            Set doc=NDCtmp.Getfirstdocument
            Do While Not doc Is Nothing
                Call NDC.Adddocument(GetDocumentByUNIDSilent(db, doc.Universalid))
                Set doc=NDCtmp.Getnextdocument(doc)
            Loop
        End If
    Else
        Set NDC= db.CreateDocumentCollection
        Set doc=gses.DocumentContext
        If Not doc Is Nothing Then Call NDC.AddDocument(doc)
    End If
    Set SelectedDocsUI=NDC
Quit:
    Exit Function
ErrH:
    Error Err, RaiseError
End Function
Код:
Function DetachFiles(objdoc As NotesDocument, fld As String, filter As String, filesList List As String) As String
    Dim file As String, path As String
    Dim rtItem As NotesRichTextItem
    Dim docItem As NotesItem
   
    On Error Goto ErrorHandler
    Erase filesList
    Set docItem=objdoc.GetFirstItem(fld)
    If Not docItem Is Nothing Then
        DbgMsg("RichText:" & Cstr(docItem.Type = RICHTEXT))
        If docItem.Type=RICHTEXT Then
            Set rtItem=docItem
        End If
    End If
   
    path=GetNotesTempDirectory() & {\}
    file=""
    If objdoc.Hasembedded Then  
        If ( Not rtItem Is Nothing ) Then
            If (Not Isempty(rtitem.EmbeddedObjects))Then
                Forall o In rtitem.EmbeddedObjects
                    Dim detach As Boolean
                    detach=True
                    If (filter<>"") Then
                        If Not (Lcase(o.Name) Like LCase(filter)) Then
                            detach=False
                        End If
                    End If
                    If detach Then
                        file=o.Name
                        filesList(file)=path
                        Call o.ExtractFile(path & file)
                    End If
                End Forall
            End If
        End If          
    End If
    If file<>"" Then DetachFiles=path & file
ExitFunction:
    Exit Function
ErrorHandler:
    Call RaiseError()
    Erase filesList
    Resume ExitFunction
End Function
GetNotesTempDirectory() СиАПИ, здесь была раз 100500
пример файлов в архиве, кладутся в док
код для кнопки - просто вызвать SaveAndRun {*.pol}
 

Вложения

  • java-policy.zip
    1,3 КБ · Просмотры: 350
  • Нравится
Реакции: alexas1

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
451
дополнение
"исправить" кодировку можно "налету", есть хак (на стэковерфло он был)
Java:
import java.lang.reflect.Field;

public class RuntimeUtils {
    public static void setEncoding(){
        System.setProperty("file.encoding","UTF-8");
        Field charset;
        try {
            charset = Charset.class.getDeclaredField("defaultCharset");
            charset.setAccessible(true);
            charset.set(null,null);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
в полиси (например в юзеровом .java.policy) надо
Код:
grant {
 permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
 
  • Нравится
Реакции: Vertigo, savl и VladSh

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 983
611
BIT
451
продолжу...
к слову об InputStream в котором нет возможности (по вполне понятным причинам) использовать указание кодировки
проблема нарисовалась где не ждал, столкнулся со странным поведением активации лицензии в aspose
до версии (включая) 21.02 лицензия (сам код либы обфусцирован), а далее - нет
случайно заметил - в шинде с командной строки ошибки нет, а в ИДЕ - есть. Стал подробно разбирать запуск, и тут мне понадобилось UTF-8 выдавать в лог (который перенаправлялся в консоль). Недолго думая chcp 65001; ...\java "-Dfile.encoding=UTF-8" -jar ... и обана - Caused by: java.lang.Exception: Failed to set license. Details: Failed to check license.
по моим догадкам - учитывая что лицуха в хмл, а там есть хэш и название которое туда должно попадать, а название включало угловые скобки
1650313384436.png

а остальные символы - однобайтовые!
смекнул что кодируя ключ - "не учли" этот факт, а в либы внесли какие-то изменения
предположение подтверждается выше (сменой кодировки в параметрах java)
решение как постом выше - менять этот проперти налету
Java:
    public void applyALicenseRes() throws IncorrectLicPathException, InvocationTargetException {
        LOG.debug("trying to register from resources with class:"+cName + "\nresource Path:" + sLicPath);
        setEncoding(StandardCharsets.ISO_8859_1);
        InputStream licStream=this.getClass().getResourceAsStream(sLicPath);
        if (licStream == null)  throw new IncorrectLicPathException("License path incorrect:" + sLicPath);
        lic.setLicense(licStream);
        setEncoding(StandardCharsets.UTF_8);
    }
решено :) в поддержку не писал (не уверен в ответе ;) )
 
Последнее редактирование:
Мы в соцсетях:

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