
On Fri, Oct 28, 2011 at 13:17, Alf P. Steinbach < alf.p.steinbach+usenet@gmail.com> wrote:
On 28.10.2011 12:36, Yakov Galka wrote:
On Fri, Oct 28, 2011 at 04:23, Alf P. Steinbach< alf.p.steinbach+usenet@gmail.**com <alf.p.steinbach%2Busenet@gmail.com>> wrote:
On 27.10.2011 23:56, Peter Dimov wrote:
The advantage of using UTF-8 is that, apart from the border layer that calls the OS (and that needs to be ported either way), the rest of the code is happily char[]-based.
Oh.
I would be happy to learn this.
How do I make the following program work with Visual C++ in Windows, using narrow character string?
<code> #include<stdio.h> #include<fcntl.h> // _O_U8TEXT #include<io.h> // _setmode, _fileno #include<windows.h>
int main() { //SetConsoleOutputCP( 65001 ); //_setmode( _fileno( stdout ), _O_U8TEXT ); printf( "Blåbærsyltetøy! 日本国 кошка!\n" ); } </code>
How will you make this program portable?
Well, that was *my* question.
The claim that this minimal "Hello, world!" program puts to the point, is that "the rest of the [UTF-8 based] code is happily char[]-based".
Apparently that is not so.
My point is that you cannot talk about things without comparison.
The out-commented code is from my random efforts to Make It Work(TM).
It refused.
This is because windows narrow-chars can't be UTF-8. You could make it portable by:
int main() { boost::printf("Blåbærsyltetøy! 日本国 кошка!\n"); }
Thanks, TIL boost::printf.
The idea of UTF-8 as a universal encoding seems now to be to use some workaround such as boost::printf for each and every case where it turns out that it doesn't work portably.
You pull things out of context. We should COMPARE the UTF-8 approach to the wide-char on windows narrow-char on non-windows approach. Your approach involves using your own printf just as well: #include "u/stdio_h.h" // u::CodingValue, u::printf, U printf(U("Blåbærsyltetøy! 日本国 кошка!\n")); // ADL? u::printf(U("Blåbærsyltetøy! 日本国 кошка!\n")); // or not ADL? depends on what exactly U is. but anyway you have to do O(N) work to wrap the N library functions you use. Your approach is no way better.
[...]
[snip]
You judge from a non-portable coed point-of-view. How about:
#include <cstdio>
#include "gtkext/message_box.h" // for gtkext::message_box
int main() { char buffer[80]; sprintf(buffer, "The answer is %d!", 6*7); gtkext::message_box(buffer, "This is a title!", gtkext::icon_blah_blah, ...); }
And unlike your code, it's magically portable! (thanks to gtk using UTF-8 on windows)
Aha. When you use a library L that translates in platform-specific ways to/from UTF-8 for you, then UTF-8 is magically portable. For use of L.
However, try to pass a `main` argument over to gtkext::message_box.
See the argv explanation in http://permalink.gmane.org/gmane.comp.lib.boost.devel/225036 -- Yakov