D1: UTF8 char[] casting to wchar[] array cast misalignment ERROR
jicman via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jun 17 06:33:18 PDT 2014
On Tuesday, 17 June 2014 at 07:49:59 UTC, monarch_dodra wrote:
> On Tuesday, 17 June 2014 at 06:44:40 UTC, Jacob Carlborg wrote:
>> On 17/06/14 04:27, jicman wrote:
>>>
>>> Greetings!
>>>
>>> I have a bunch of files plain ASCII, UTF8 and UTF16 with and
>>> without BOM
>>> (Byte Order Mark). I had, "I thought", a nice way of
>>> figuring out what
>>> type of encoding the file was (ASCII, UTF8 or UTF16) when the
>>> BOM was
>>> missing, by reading the content and applying the
>>> std.utf.validate
>>> function to the char[] or, wchar[] string. The problem is
>>> that lately,
>>> I am hitting into a wall with the "array cast misalignment"
>>> when casting
>>> wchar[]. ie.
>>>
>>> auto text = cast(string) file.read();
>>> wchar[] temp = cast(wchar[]) text;
>>
>> How about casting to "wchar[]" directory, instead of going
>> through "string".
>
Thanks.
> No, the issue is that the OP is taking an array of smaller
> elements (probably containing an *ODD* amount of elements), and
> casting that as a bigger element type. If the original array
> size is not a multiple of the target element size, then it'll
> end up "slicing" the last element, and trigger said "array cast
> misalignment".
>
> The error message (IMO), is unclear, since "misalignement"
> usually refers to *position* in memory. I think "array cast
> length mismatch" would be a better error message.
>
> In any case, OP, something like:
>
> auto text = file.read().assumeUnique;
> size_t u = text.length % wchar.sizeof/char.sizeof;
> if (u != 0) {
> // text MUST be of "char[]" type
> } else {
> //OK! Here, the cast is legal: "text" *can* be of type
> "wchar[]" type.
> }
More information about the Digitalmars-d-learn
mailing list