Описание функции


detectTextEncodingInBuffer

Определить кодировку текста по указателю.

detectTextEncodingInBuffer(*buffer, length, flags = 0)

Параметры

buffer Указатель на текст, например данные при открытии файла с помощью ReadData
length Длина в байтах, например ReadData возвратит число прочитанных файт
flags Битовые флаги набор из следующих
#disallowNulls - не позволятm Null быть в кодировке ASCII или Unicode (UTF-8, UTF-16 и UTF-32)
#enforceProperSurrogateCodes - суррогатные коды должны быть соединены в правильном порядке
#restrictSurrogateCodesToUTF16 - разрешать суррогатные коды только в кодировках UTF-16

Возвращаемое значение

Возвращает число, которое соответсвует стандартным константам PureBasic:
    #PB_Ascii = "ASCII"
    #PB_Unicode = "Unicode"
    #PB_UTF8 = "UTF-8"
    #PB_UTF16BE = "UTF-16BE"
    #PB_UTF32 = "UTF-32"
    #PB_UTF32BE = "UTF-32BE"
    #encodingUndetermined = "Не определено"
    #err_emptyFile = "Файл пуст"
    #err_detectionProcessFailedToStart = "Не удалось запустить процесс обнаружения"

Примечания

Также модуль содержит функции:
detectTextEncodingInFile() - определить кодировку файла, т.е. открытие с помощью ReadData
detectTextEncodingOfBuffers() - определяет массив буферов и возвращает массив результатов
detectTextEncodingOfFiles() - определяет массив файлов и возвращает массив результатов
textForDetectedStringFormat() - возвращает результат в виде текстовой строки, например "UTF-8"
isNativePureBasicFormat() - возвращает только #PB_Ascii, #PB_Unicode, #PB_UTF8 как #True, остальное #False

Пример

; Demivec
; https://www.purebasic.fr/english/viewtopic.php?p=478874
EnableExplicit
XIncludeFile "AutoDetectTextEncoding.pbi"

Procedure OpenFileToSci(FilePath$)
    Protected length, oFile, bytes, *MemFile, g_Format
    oFile = ReadFile(#PB_Any, FilePath$)
    If oFile
        g_Format = ReadStringFormat(oFile) ; считываем метку BOM
        length = Lof(oFile)
        *MemFile = AllocateMemory(length)
        If *MemFile
            bytes = ReadData(oFile, *MemFile, length)
            If bytes
                If g_Format = #PB_Ascii ; нет метки, но файл всё ещё может быть в формате UTF-8
                    g_Format = dte::detectTextEncodingInBuffer(*MemFile, bytes, 0)
                    If g_Format = #PB_Ascii
                        Debug "Ascii"
                    ElseIf g_Format = #PB_UTF8
                        Debug "UTF-8 без BOM"
                    Else
                        Debug "Один из редких форматов"
                    EndIf
                Else
                    Debug "#PB_UTF8 с BOM"
                EndIf
                MessageRequester("", PeekS(*MemFile, -1, g_Format))
                FreeMemory(*MemFile)
            EndIf
        EndIf
        CloseFile(oFile)
    EndIf
EndProcedure

OpenFileToSci("C:\file.txt")