On Tuesday, 5 May 2020 at 19:24:41 UTC, WebFreak001 wrote:
On Tuesday, 5 May 2020 at 18:41:50 UTC, learner wrote:
Good morning,

Trying to do this:

```
bool foo(string s) nothrow { return s.all!isDigit; }
```

I realised that the conversion from char to dchar could throw.

I need to validate and operate over ascii strings and utf8 strings, possibly in separate functions, what's the best way to transition between:

```
immutable(ubyte)[] -> validate utf8 -> string -> nothrow usage -> isDigit etc immutable(ubyte)[] -> validate ascii -> AsciiString? -> nothrow usage -> isDigit etc string -> validate ascii -> AsciiString? -> nothrow usage -> isDigit etc
```

Thank you

Thank you WebFreak,


if you want nothrow operations on the sequence of characters (bytes) of the strings, use `str.representation` to get `immutable(ubyte)[]` and work on that. This is useful for example for doing indexOf (countUntil), startsWith, endsWith, etc. Make sure at least one of your inputs is validated though to avoid potentially handling or cutting off unfinished code points. I think this is the best way to go if you want to do simple things.

What I really want is a way to validate an immutable(ubyte)[] sequence for UFT8 or ASCII, and from that point forward, apply functions like isDigit in nothrow functions.

If your algorithm is sufficiently complex that you would like to still decode but not crash, you can also manually call .decode with UseReplacementDchar.yes to make it emit \uFFFD for invalid characters.

I will simply reject invalid UTF8 input, that's coming from I/O

To get the best of both worlds, use `.byUTF!dchar` which gives you an input range to iterate over and defaults to using replacement dchar. You can then call the various algorithm & array functions on it.

Can you explain better?

Unless you are working with different encodings than UTF-8 (like doing file or network operations) you shouldn't be needing std.encoding.

I'm expecting UTF8 and ASCII encoding from I/O

Thank you!


Reply via email to