<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40" xmlns:ns0="urn:schemas-microsoft-com:office:smarttags"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><title>RE: [DUG] Upgrading to XE - Unicode strings questions</title><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"\@Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Arial","sans-serif";}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Arial","sans-serif";
        color:#1F497D;
        font-weight:normal;
        font-style:normal;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Arial","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoPlainText><span style='color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'>Jolyon beat me to answer those questions .. but here are my additional 2 cents:<o:p></o:p></span></p><p class=MsoPlainText><span style='color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'><o:p>&nbsp;</o:p></span></p><p class=MsoPlainText><span style='color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'> <o:p></o:p></span></p><p class=MsoPlainText><span style='color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'>Q1: Unicode strings treat each character as 2 bytes - &quot;length&quot; returns the number of characters, not the &quot;size&quot; of memory allocated. Each access to it with an array syntax returns you a widechar instead of an ansichar. Your &quot;DoSomethingWithOneChar&quot; procedure will be called with a widechar as input but that probably won't cause any problems as widechar is a superset of ansichar so there won't be any issues when going in that direction.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'>Q8: stringlist.loadfromfile will auto-detect the encoding by looking for magic markers (BOM code 0xEF 0xBB 0xBF for UTF8 at the beginning of the file) and other things, like Unicode-codepoint encoding validity.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'>Q11: inifiles: yes, these files will now have support for Unicode too. <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#17375E;mso-style-textfill-fill-color:#17375E;mso-style-textfill-fill-alpha:100.0%'>Q13: Unicode is synonymous for “character encoding of the universal character set” – so it actually consists of two parts, the character set (about 109,000 characters are officially defined) and the various encoding formats that are used to represent those characters (utf8/utf16/utf32/ucs2/ucs4/etc). Windows started with UCS-2 (in Windows NT) and then switched to UTF16. UCS-2 only allowed 65535 characters so Microsoft had to switch to UTF-16 in newer windows version to support the full character set. This means that some weird and/or no longer used characters from dead/historic languages can sometimes take up more than 2 bytes (the size of a widechar) – this isn’t usually an issue when developing Unicode enabled applications … unless your software needs to handle and display things like “cuneiform script” perfectly.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D'> <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:navy'><br></span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:black'>Kind Regards,<br>Stefan Mueller</span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#585757'> <br></span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666699'>_______________________<br>R&amp;D Manager<br>ORCL&nbsp;Toolbox LLP, </span><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'><ns0:place><ns0:country-region><ns0:country-region><ns0:place><span style='color:#666699'>Japan</span></ns0:place></ns0:country-region></ns0:country-region></ns0:place><span style='color:#666699'><br></span><span style='color:blue'><a href="http://www.orcl-toolbox.com/" title="blocked::http://www.orcl-toolbox.com/">http://www.orcl-toolbox.com</a></span><span style='color:#585757'> </span></span><span style='font-size:10.0pt;font-family:"Calibri","sans-serif";color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:navy'>&nbsp;</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> delphi-bounces@delphi.org.nz [mailto:delphi-bounces@delphi.org.nz] <b>On Behalf Of </b>Jolyon Smith<br><b>Sent:</b> Tuesday, November 23, 2010 9:40 AM<br><b>To:</b> 'NZ Borland Developers Group - Delphi List'<br><b>Subject:</b> Re: [DUG] Upgrading to XE - Unicode strings questions<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>I'm guessing my response to your previous email didn't come thru for some reason - resending:</span><o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>I shall address some of your questions that I can answer quickly:</span><o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q2 – With XE do the .pas and .dfm files become unicode text and hence </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cannot be read by earlier Delphi, eg D2007 any more?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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</span><span lang=EN-NZ> </span><span lang=EN-NZ style='font-family:Consolas'>it may even have been as far back as D7 or even earlier that it was introduced.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>(Right click in source/dfm file and choose &quot;File Format&quot; from the context menu to see/change the file encoding)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q3 – I do a lot of reading ascii data files, and writing back.&nbsp;&nbsp; Using </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>mainly TFilestream and stringlists.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Which TFileStream you should be OK, as long as you read/write into ANSIString/ANSIChar buffers as you already surmised.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q4 – if I do s2:=as1&nbsp; does this convert ansistrings to unicode?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q5 – if I do as1:=s2 does this convert a unicode string to ansstring?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q6 – I understand any code like</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char1:=string1[i];</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if char1 in [‘a’..’z’] then</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&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’;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will break.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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:</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp; if ANSICHAR(char1) in ['a'..'z'] then</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>CharInSet() performs a test for the Char being</span><span lang=EN-NZ> </span><span lang=EN-NZ style='font-family:Consolas'>(C &lt; #$0100), 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.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>That is just my preference however.&nbsp; Ymmv.</span><o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q7 – do literals like&nbsp; #13#10 still mean carriage return and linefeed?&nbsp; #9 means tab?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Yes.&nbsp; But one thing to be aware of is that #nnn won't necessarily yield an ANSIChar(nnn).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q8 – stringlist1.loadfromfile(‘Test1.txt’);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what happens if this file is ascii text being read into a stringlist which is unicode strings.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>The stringlist will contain UnicodeStrings, converted from the ASCII file content that was loaded.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q9 -&nbsp;&nbsp; stringlist1.savetofile(‘Test1.txt’)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; presumably this is no longer ascii text.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>It won't be ASCII (but technically it never was :)) it will be ANSI unless you.</span><o:p></o:p></p><p class=MsoNormal style='margin-bottom:12.0pt'><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q9a - How do I save and read a stringlist to/from a file if it is to be Ansi text?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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:</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp; strings.SaveToFile(filename, TEncoding.UTF8);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q10 – If there are complexities in Q8 and Q9 is there a TAnsiStringlist type (for ansistrings) as well as a unicode TStringlist type?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>NOPE!&nbsp;&nbsp; A shocking omission imho.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>Q12 – does Windows Notepad open unicode text files correctly?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas;color:#548DD4'>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?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>UTF-8 *<b>is</b>* Unicode.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Unicode is a character set (technically it is more than that, but for the purposes of this explanation that definition will suffice).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>UTF8/16/32 are different *<b>encodings</b>* for that character set.&nbsp; For UTF16 and UTF32 there are also Big and Little Endianed variants.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>As noted before, in Notepad, and possibly in other apps, the term “Unicode” denotes “UTF16”.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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).</span><o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>As far as the difference between ASCII and UTF8 encoded Unicode goes:</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>An ASCII file can represent only characters 0..128 and each character is certain to occupy a single byte.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>A UTF8 file can represent *<b>EVERY</b>* Unicode character, not just ASCII, but characters with codepoints &gt; 127 will occupy 2 or more bytes.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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 *<b>true</b>* 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).</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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.</span><o:p></o:p></p><p class=MsoNormal style='margin-bottom:12.0pt'><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>I hope that all helps a little.</span><o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p><span lang=EN-NZ style='font-size:10.0pt;font-family:Wingdings'>J</span><o:p></o:p></p><p class=MsoNormal style='margin-bottom:12.0pt'><br><br><o:p></o:p></p><p><span style='font-family: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</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Thanks for the references, so I can answer most of the questions now. </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Here is what I understand so far, if anyone has anything to add this will be </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>useful!</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Extra question:</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>It looks like code like</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp; for i:=1 to length(string1) do</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp; begin</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DoSomethingWithOneChar(string1[i]);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp; end;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>cannot be used reliably.&nbsp;&nbsp; The problems are that length(string1) looks like </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>it cannot be safely used - as unicode characters may include 2 codepoints </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>and length(string1) highlights that there is a difference between the number </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>of unicode characters in a string and the number of codepoints.&nbsp;&nbsp; Still </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>figuring out what is the best practice here, as I have quite a lot of string </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>routines.&nbsp;&nbsp; Should be be OK as long as the unicode text actually is ASCII.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q2 – With XE do the .pas and .dfm files become unicode text and hence cannot</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>be read by earlier Delphi, eg D2007 any more?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - Is a project option from what I have read?, yes not portable if </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>unicode.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q3 – I do a lot of reading ascii data files, and writing back.&nbsp;&nbsp; Using</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>mainly TFilestream and stringlists.&nbsp;&nbsp; Does this in general mean I will need</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>to use file variables declared as Ansichar and AnsiString instead of Char</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>and String?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>(I would prefer to use the standard VCL where possible)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>If I have variables</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as1:Ansistring;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2:string;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q4 –&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if I do s2:=as1&nbsp; does this convert ansistrings to unicode?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - yes, there are performance issues to watch out for if conversion </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>happens a lot.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q5 – if I do as1:=s2 does this convert a unicode string to ansistring?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp; (otherwise how do I do this?)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - yes, there are performance issues to watch out for if conversion </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>happens a lot.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q6 – I understand any code like</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char1:=string1[i];</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if char1 in [‘a’..’z’] then</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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’;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will break, as ansi characters are ordinal (less than 256 or 512)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>and set comparisons ['a'..'z']&nbsp; or ['a','b','c']&nbsp;&nbsp;&nbsp; can be used, this set</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>code cannot be used for unicode characters.&nbsp;&nbsp; What is the replacement?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - There is CharInSet call and numerous extra housekeeping functions </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>added in TCharacter.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q7 – do literals like&nbsp; #13#10 still mean carriage return and linefeed?&nbsp; #9</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>means tab?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if I have code like (logline string1 string2 are string)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logline:=FormatDateTime(‘dd-mmm-yyyy hh:nn:ss’,now) + string1 +</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>#13#10+#9 + string2;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(logline);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button1.hint:=logline;</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeln(f,logline);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; these work D5-D2007&nbsp;&nbsp; - ie a 2 line messagebox text, 2 line hint,</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>and 2 lines written to a log file.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is this still going to work?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do carriage returns/tabs/other control characters have to be defined</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>differently, eg as constants?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - not figured out yet - anyone else know?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q8 – stringlist1.loadfromfile(‘Test1.txt’);</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; what happens if this file is ascii text being read into a stringlist</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>which is unicode strings.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - Default is Ascii text for loadfromfile and savetofile, use </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>overloaded routines for Unicode</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q9 -&nbsp;&nbsp; stringlist1.savetofile(‘Test1.txt’)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family: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</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>stringlist to/from a file if it is to be Ansi text?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q10 – If there are complexities in Q8 and Q9 is there a TAnsiStringlist</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>type (for ansistrings) as well as a unicode TStringlist type?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (I use stringlists a lot)</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - unicodestring lists can save to ascii or unicode files, so </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>TAnsiStringlist not needed.</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q11 – do inifiles become unicode too?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Answer - looks like no?&nbsp; Not clear?&nbsp; Anyone else know?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q12 – does Windows Notepad open unicode text files correctly?&nbsp;&nbsp; or can it</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>only be used on Ansi text files?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Anyone know this?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Q13 - It looks like most programmers editors read and write ascii and</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>unicode encoding.....the one I use seems to distinguish between UTF-8 and</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>unicode as well – what is the difference?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Anyone know this?</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>John</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>_______________________________________________</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>NZ Borland Developers Group - Delphi mailing list</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a></span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</a></span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>unsubscribe </span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>_______________________________________________</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>NZ Borland Developers Group - Delphi mailing list</span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Post: <a href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a></span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</a></span><o:p></o:p></p><p><span lang=EN-NZ style='font-family:Consolas'>Unsubscribe: send an email to <a href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe</span><o:p></o:p></p></div></body></html>