<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<META NAME="Generator" CONTENT="MS Exchange Server version 08.00.0681.000">
<TITLE>RE: [DUG] Upgrading to XE - Unicode strings questions</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">I'm guessing my response to your previous email didn't come thru for some reason</FONT></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas"> - resending</FONT></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">:</FONT></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">I shall address some of your questions that I can answer quickly:</FONT></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q2 – With XE do the .pas and .dfm files become unicode text and hence </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cannot be read by earlier Delphi, eg D2007 any more?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">I forget precisely which version of the IDE introduced the change, but the IDE has for some time supported different encodings for source/DFM files.&nbsp; Certainly this was present in D2006 and</FONT></SPAN><SPAN LANG="en-nz"> <FONT FACE="Consolas">it may even have been as far back as D7</FONT></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas"> or even earlier that it was introduced.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">(Right click in source/dfm file and choose &quot;File Format&quot; from the context menu to see/change the file encoding)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q3 – I do a lot of reading ascii data files, and writing back.&nbsp;&nbsp; Using </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">mainly TFilestream and stringlists.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Which TFileStream you should be OK, as long as you read/write into ANSIString/ANSIChar buffers as you already surmised.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">With TStringList you are forced to push your data through a Unicode/ANSI conversion when reading/writing from/to ANSI files, since the TStringList itself holds UnicodeString items.&nbsp; You can do this using the new &quot;Encoding&quot; parameter to the relevant methods of the class to ensure you read/write the correct/expected encoding (reading should correctly detect the encoding, but when writing you will need to be explicit).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q4 – if I do s2:=as1&nbsp; does this convert ansistrings to unicode?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q5 – if I do as1:=s2 does this convert a unicode string to ansstring?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Yes, but you will get a warning when going from Unicode to ANSI (since not all ANSI encodings will support the possible content of a Unicode string).&nbsp; To avoid this, be explicit with the conversion.</FONT></SPAN><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q6 – I understand any code like</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char1:=string1[i];</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if char1 in [‘a’..’z’] then</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message:=string[i]+’ - character is lowercase’;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will break.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Nope, it's fine.&nbsp; But again, you will get a warning, in this case that the WIDECHAR has been reduced to a BYTE (NOTE: not converted to ANSICHAR) and a suggestion that you use CharInSet() instead.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Note however that CharInSet contains no real &quot;magic&quot; that makes sets work for &gt; 255 elements - it merely provides a wrapper around code that will avoid the suggestion that you use CharInSet().&nbsp; You can achieve the same effect by again simply being explicit that you know that what you are doing is intended and safe by reducing the WideChar to an ANSIChar yourself:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp; if ANSICHAR(char1) in ['a'..'z'] then</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">To my mind this is preferable to using CharInSet() as it makes it clearer in the code what is going on (that non-ANSIChars are not expected and may not be handled as intended).&nbsp; Using CharInSet() won't make any material difference to the behaviour of the code, but it would make it less apparent what is going on (i.e. that your code deals specifically with ANSI chars).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">CharInSet() performs a test for the Char being</FONT></SPAN><SPAN LANG="en-nz"> <FONT FACE="Consolas">(C &lt; #$0100)</FONT></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">, but if your code is dealing with ANSI chars packaged in Unicode strings then this test is redundant, and using CharInSet() hides the intent of your code - to deal specifically with ANSI.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">That is just my preference however.&nbsp; Ymmv.</FONT></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q7 – do literals like&nbsp; #13#10 still mean carriage return and linefeed?&nbsp; #9 means tab?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Yes.&nbsp; But one thing to be aware of is that #nnn won't necessarily yield an ANSIChar(nnn).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q8 – stringlist1.loadfromfile(‘Test1.txt’);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what happens if this file is ascii text being read into a stringlist which is unicode strings.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">The stringlist will contain UnicodeStrings, converted from the ASCII file content that was loaded.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q9 -&nbsp;&nbsp; stringlist1.savetofile(‘Test1.txt’)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; presumably this is no longer ascii text.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">It won't be ASCII (but technically it never was :)) it will be ANSI unless you.</FONT></SPAN></P>
<BR>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q9a - How do I save and read a stringlist to/from a file if it is to be Ansi text?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">As you would have done before.&nbsp; It is if you want to save to something other than ANSI that you have to invoke the Encodings parameter, for example to save as UTF8:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp; strings.SaveToFile(filename, TEncoding.UTF8);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q10 – If there are complexities in Q8 and Q9 is there a TAnsiStringlist type (for ansistrings) as well as a unicode TStringlist type?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">NOPE!&nbsp;&nbsp; A shocking omission imho.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q12 – does Windows Notepad open unicode text files correctly?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Yep – and it’s a handy tool for testing variations in encoding (In Notepad when you “Save As” you can choose the encoding: ANSI, UTF8, BE Unicode or LE Unicode (here “Unicode” = UTF16).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">When you “Save As” a file that you previously opened, the default encoding selected will reflect the encoding of the file when it was opened.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT COLOR="#548DD4" FACE="Consolas">Q13 - It looks like most programmers editors read and write ascii and unicode encoding.....the one I use seems to distinguish between UTF-8 and unicode as well – what is the difference?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">UTF-8 *</FONT></SPAN><SPAN LANG="en-nz"><B><FONT FACE="Consolas">is</FONT></B></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">* Unicode.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Unicode is a character set (technically it is more than that, but for the purposes of this explanation that definition will suffice).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">UTF8/16/32 are different *</FONT></SPAN><SPAN LANG="en-nz"><B><FONT FACE="Consolas">encodings</FONT></B></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">* for that character set.&nbsp; For UTF16 and UTF32 there are also Big and Little Endianed variants.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">As noted before, in Notepad, and possibly in other apps, the term “Unicode” denotes “UTF16”.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">UTF32 is rarely encountered in the wild, which might explain why there is no TEncoding support for it (and indeed why Notepad doesn’t appear to support it).</FONT></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">As far as the difference between ASCII and UTF8 encoded Unicode goes:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">An ASCII file can represent only characters 0..128 and each character is certain to occupy a single byte.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">A UTF8 file can represent *</FONT></SPAN><SPAN LANG="en-nz"><B><FONT FACE="Consolas">EVER</FONT></B></SPAN><SPAN LANG="en-nz"><B><FONT FACE="Consolas">Y</FONT></B></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">* Unicode character, not just ASCII, but characters with codepoints &gt; 127 will occupy 2 or more bytes.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">You may have spotted that for an ASCII file, ASCII and UTF8 encoding are physically indistinguishable at the character data level.&nbsp; However, a *</FONT></SPAN><SPAN LANG="en-nz"><B><FONT FACE="Consolas">true</FONT></B></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">* UTF8 file (as opposed to an ASCII file that could be treated naively as UTF8 – or vice versa) will have a BOM (Byte Order Marker).</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">A BOM is a sequence of bytes that is prepended to a file (or stream) to indicate the Unicode encoding and identify the byte order for those encodings that have big/little endian variants.</FONT></SPAN></P>
<BR>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">I hope that all helps a little.</FONT></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Wingdings" SIZE=2>J</FONT></SPAN><SPAN LANG="en-nz"></SPAN><SPAN LANG="en-nz"></SPAN><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>
<BR>
<BR>
<BR>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"></SPAN><SPAN LANG="en-us"><FONT FACE="Consolas">-----Original Message-----<BR>
From: delphi-bounces@delphi.org.nz [<A HREF="mailto:delphi-bounces@delphi.org.nz">mailto:delphi-bounces@delphi.org.nz</A>] On Behalf Of John Bird<BR>
Sent: Tuesday, 23 November 2010 13:04<BR>
To: NZ Borland Developers Group - Delphi List<BR>
Subject: Re: [DUG] Upgrading to XE - Unicode strings questions</FONT></SPAN><SPAN LANG="en-nz"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas"></FONT></SPAN><SPAN LANG="en-nz"><FONT FACE="Consolas">Thanks for the references, so I can answer most of the questions now. </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Here is what I understand so far, if anyone has anything to add this will be </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">useful!</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Extra question:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">It looks like code like</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp; for i:=1 to length(string1) do</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp; begin</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DoSomethingWithOneChar(string1[i]);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp; end;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">cannot be used reliably.&nbsp;&nbsp; The problems are that length(string1) looks like </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">it cannot be safely used - as unicode characters may include 2 codepoints </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">and length(string1) highlights that there is a difference between the number </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">of unicode characters in a string and the number of codepoints.&nbsp;&nbsp; Still </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">figuring out what is the best practice here, as I have quite a lot of string </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">routines.&nbsp;&nbsp; Should be be OK as long as the unicode text actually is ASCII.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q2 – With XE do the .pas and .dfm files become unicode text and hence cannot</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">be read by earlier Delphi, eg D2007 any more?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - Is a project option from what I have read?, yes not portable if </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">unicode.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q3 – I do a lot of reading ascii data files, and writing back.&nbsp;&nbsp; Using</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">mainly TFilestream and stringlists.&nbsp;&nbsp; Does this in general mean I will need</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">to use file variables declared as Ansichar and AnsiString instead of Char</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">and String?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">(I would prefer to use the standard VCL where possible)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">If I have variables</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as1:Ansistring;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2:string;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q4 –&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if I do s2:=as1&nbsp; does this convert ansistrings to unicode?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - yes, there are performance issues to watch out for if conversion </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">happens a lot.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q5 – if I do as1:=s2 does this convert a unicode string to ansistring?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp; (otherwise how do I do this?)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - yes, there are performance issues to watch out for if conversion </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">happens a lot.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q6 – I understand any code like</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char1:=string1[i];</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if char1 in [‘a’..’z’] then</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message:=string[i]+’ - character is lowercase’;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will break, as ansi characters are ordinal (less than 256 or 512)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">and set comparisons ['a'..'z']&nbsp; or ['a','b','c']&nbsp;&nbsp;&nbsp; can be used, this set</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">code cannot be used for unicode characters.&nbsp;&nbsp; What is the replacement?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - There is CharInSet call and numerous extra housekeeping functions </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">added in TCharacter.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q7 – do literals like&nbsp; #13#10 still mean carriage return and linefeed?&nbsp; #9</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">means tab?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if I have code like (logline string1 string2 are string)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logline:=FormatDateTime(‘dd-mmm-yyyy hh:nn:ss’,now) + string1 +</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">#13#10+#9 + string2;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(logline);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1.hint:=logline;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln(f,logline);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; these work D5-D2007&nbsp;&nbsp; - ie a 2 line messagebox text, 2 line hint,</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">and 2 lines written to a log file.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is this still going to work?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do carriage returns/tabs/other control characters have to be defined</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">differently, eg as constants?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - not figured out yet - anyone else know?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q8 – stringlist1.loadfromfile(‘Test1.txt’);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what happens if this file is ascii text being read into a stringlist</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">which is unicode strings.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - Default is Ascii text for loadfromfile and savetofile, use </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">overloaded routines for Unicode</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q9 -&nbsp;&nbsp; stringlist1.savetofile(‘Test1.txt’)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; presumably this is no longer ascii text.&nbsp;&nbsp; How do I save and read a</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">stringlist to/from a file if it is to be Ansi text?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q10 – If there are complexities in Q8 and Q9 is there a TAnsiStringlist</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">type (for ansistrings) as well as a unicode TStringlist type?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (I use stringlists a lot)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - unicodestring lists can save to ascii or unicode files, so </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">TAnsiStringlist not needed.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q11 – do inifiles become unicode too?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Answer - looks like no?&nbsp; Not clear?&nbsp; Anyone else know?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q12 – does Windows Notepad open unicode text files correctly?&nbsp;&nbsp; or can it</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">only be used on Ansi text files?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Anyone know this?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Q13 - It looks like most programmers editors read and write ascii and</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">unicode encoding.....the one I use seems to distinguish between UTF-8 and</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">unicode as well – what is the difference?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Anyone know this?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">John</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">_______________________________________________</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">NZ Borland Developers Group - Delphi mailing list</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Post: delphi@delphi.org.nz</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Admin: <A HREF="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</A></FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Unsubscribe: send an email to delphi-request@delphi.org.nz with Subject: </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">unsubscribe </FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">_______________________________________________</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">NZ Borland Developers Group - Delphi mailing list</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Post: delphi@delphi.org.nz</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Admin: <A HREF="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</A></FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-nz"><FONT FACE="Consolas">Unsubscribe: send an email to delphi-request@delphi.org.nz with Subject: unsubscribe</FONT></SPAN></P>

</BODY>
</HTML>