PowerBuilder 12, как определить кодировку входного файла - PullRequest
3 голосов
/ 29 января 2012

Я новичок в PowerBuilder 12 и хотел бы знать, есть ли способ определить кодировку (например, Unicode, BIG5) входного файла.Любые комментарии и примеры кода приветствуются!Спасибо!

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Из файла справки PB 12.5:

FileEncoding (имя файла)

filename: имя файла, который вы хотите проверить на тип кодирования

Возвращаемые значения EncodingANSI!EncodingUTF8!EncodingUTF16LE!EncodingUTF16BE!Если имя файла не существует, возвращает ноль.

0 голосов
/ 30 января 2012

Поиск Unicode довольно прост, если вы предполагаете, что файл Unicode имеет префикс BOM (хотя реальность такова, что не все файлы Unicode имеют это). Некоторый код для этого ниже. Тем не менее, я понятия не имею о Big5; мне кажется (на первый взгляд спецификация никогда не использовалась), как будто у него нет подобного префикса.

Удачи,

Терри

function of_filetype (string as_filename) returns encoding

integer li_NullCount, li_NonNullCount, li_OffsetTest
long ll_File
encoding le_Return
blob lblb_UTF16BE, lblb_UTF16LE, lblb_UTF8, lblb_Test, lblb_BOMTest, lblb_Null

lblb_UTF16BE = Blob ("~hFE~hFF", EncodingANSI!)
lblb_UTF16LE = Blob ("~hFF~hFE", EncodingANSI!)
lblb_UTF8 = Blob ("~hEF~hBB~hBF", EncodingANSI!)
lblb_Null = blobmid (blob ("~h01", encodingutf16le!), 2, 1)

SetNull (le_Return)

// Get a set of bytes to test
ll_File = FileOpen (as_FileName, StreamMode!, Read!, Shared!)
FileRead (ll_File, lblb_Test)
FileClose (ll_File)

// test for BOMs: UTF-16BE (FF FE), UTF-16LE (FF FE), UTF-8 (EF BB BF)
lblb_BOMTest = BlobMid (lblb_Test, 1, Len (lblb_UTF16BE))
IF lblb_BOMTest = lblb_UTF16BE THEN RETURN EncodingUTF16BE!

lblb_BOMTest = BlobMid (lblb_Test, 1, Len (lblb_UTF16LE))
IF lblb_BOMTest = lblb_UTF16LE THEN RETURN EncodingUTF16LE!

lblb_BOMTest = BlobMid (lblb_Test, 1, Len (lblb_UTF8))
IF lblb_BOMTest = lblb_UTF8 THEN RETURN EncodingUTF8!

//I've removed a hack from here that I wouldn't encourage others to use, basically checking for 
//0x00 in places I'd "expect" them to be if it was a Unicode file, but that makes assumptions

RETURN le_Return
...