> Le 31 août 2017 à 00:53, Cannon Smith via 4D_Tech <[email protected]> a
> écrit :
>
> I’m having trouble with saving Unicode characters to a file. For example, the
> following code saves a file to disk:
>
> C_TEXT($tText;$tFilepath)
>
> $tText:=“©” //Copyright symbol
> $tFilepath:=System folder(Desktop)+"test.txt"
> TEXT TO DOCUMENT($tFilepath;$tText;UTF8 text without length)
>
> When I open the file again, it only contains a “?” character.
>
> If I use:
>
> TEXT TO DOCUMENT($tFilepath;$tText)
>
> it saves correctly, but then the file has a BOM character at the beginning
> which is wreaking havoc with other systems that aren’t expecting it.
>
> Does anyone know what I should be doing here? Thanks.
Hi Cannon,
in addition to others…
Before v14 introduced the "text to document/document to text" pair of commands,
I had these wrappers:
****
//FS_textToDocument (path_t;text_t {;charset_t)
//writes text $2 in document $1
//creates $1 if it doesn't exist
//$3 optional charSet, default utf-8
//cf FS_documentToText
C_TEXT($1)
C_TEXT($2)
C_TEXT($3)
C_BLOB($data_x)
C_LONGINT($params_l)
C_TEXT($doc_t)
C_TEXT($text_t)
C_TEXT($charSet_t)
C_TEXT($nmc_t)
If (False)
C_TEXT(FS_textToDocument ;$1)
C_TEXT(FS_textToDocument ;$2)
C_TEXT(FS_textToDocument ;$3)
End if
$nmc_t:=Current method name
$params_l:=Count parameters
Case of
: (Not(Asserted($params_l>1;$nmc_t+" 2 params expected")))
: (Not(Asserted(Length($1)>0;$nmc_t+" $1 document path empty")))
Else
$doc_t:=$1
$text_t:=$2
$charSet_t:="utf-8"
If ($params_l>2)
$charSet_t:=$3
End if
CONVERT FROM TEXT($text_t;$charSet_t;$data_x)
BLOB TO DOCUMENT($doc_t;$data_x)
End case
//_
****
//FS_documentToText (path_t {;charSet_t) -> txt
//reads $1 document and returns $0 text
//$2 optional charSet, default utf-8
//cf FS_textToDocument
C_TEXT($0)
C_TEXT($1)
C_TEXT($2)
C_BLOB($data_x)
C_TEXT($doc_t)
C_LONGINT($lineEnd_l)
C_LONGINT($params_l)
C_TEXT($charSet_t)
C_TEXT($nmc_t)
If (False)
C_TEXT(FS_documentToText ;$0)
C_TEXT(FS_documentToText ;$1)
C_TEXT(FS_documentToText ;$2)
End if
$nmc_t:=Current method name
$params_l:=Count parameters
Case of
: (Not(Asserted($params_l>0;$nmc_t+" $1 document path expected")))
: (Not(Asserted(Test path name($1)=Is a document;$nmc_t+" $1 not a document
path")))
Else
$doc_t:=$1
$charSet_t:="utf-8"
If ($params_l>1)
$charSet_t:=$2
End if
DOCUMENT TO BLOB($doc_t;$data_x)
$0:=Convert to text($data_x;$charSet_t)
End case
//_
****
Another caveat with TEXT TO DOCUMENT is the default line breaks management,
platform dependent (from doc: "Document with native format (Default)...Line
breaks are converted to the native format of the operating system: CR (carriage
return) under OS X, CRLF (carriage return + line feed) under Windows").
Constant 'Document unchanged' is your friend if you don't want to be surprised…
--
Arnaud de Montard
**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ: http://lists.4d.com/faqnug.html
Archive: http://lists.4d.com/archives.html
Options: http://lists.4d.com/mailman/options/4d_tech
Unsub: mailto:[email protected]
**********************************************************************