We're aware that some users are experiencing technical issues which the team are working to resolve. See the Community Noticeboard for more info. Thank you for your patience.
📨 Have you signed up to the Forum's new Email Digest yet? Get a selection of trending threads sent straight to your inbox daily, weekly or monthly!

Extended characters in batch files?

Options
esuhl
esuhl Posts: 9,409 Forumite
Part of the Furniture 1,000 Posts Name Dropper
I'm writing a Windows batch script which outputs text to the console and to a log file.

I remember, from the days of DOS, there were characters in the "extended" ASCII range that could be used for drawing boxes, like the ones here:

https://en.wikipedia.org/wiki/Box_Drawing

I copied and pasted the box characters into my batch file and ran it. The log file uses the characters correctly; but the on-screen text has different accented letters appearing instead.

I found this article that explains that the problem is related to using different "code pages", but it doesn't say how to work round the issue.

https://blogs.msdn.microsoft.com/oldnewthing/20050308-00/?p=36253

Essentially, I want my batch file to be able to run on any Windows machine and produce the correct characters each time.

Is that possible?
«1

Comments

  • John_Gray
    John_Gray Posts: 5,843 Forumite
    Part of the Furniture 1,000 Posts Name Dropper Photogenic
    edited 4 February 2017 at 10:49PM
    I gave up on that problem years ago, because there seems to be different usage of character sets/code pages.
    Now I even do boxes as
    echo +---------------+
    echo I BATchFileName I
    echo +---------------+
    
    because I can't guarantee the vertical bar | ...

    Later: there's something here, perhaps worth a read?

    Even later: when I do CHCP it shows that in Windows 10 Pro (at least!) the Command Prompt window is using Code Page 850 which has a limited range of box-drawing characters. See what you get by playing with this CP.
    Don't forget you will need to escape the vertical bar by putting a carat before it, as in
    echo ^|
  • esuhl
    esuhl Posts: 9,409 Forumite
    Part of the Furniture 1,000 Posts Name Dropper
    Thanks for the tips. I also asked this question on another thread and got some more information here if anyone is interested:

    http://www.dostips.com/forum/viewtopic.php?f=3&t=7701
  • John_Gray
    John_Gray Posts: 5,843 Forumite
    Part of the Furniture 1,000 Posts Name Dropper Photogenic
    Interesting - but rather complicated for my decrepit brain...!
  • bluesnake
    bluesnake Posts: 1,460 Forumite
    dos also often used the ansi.sys device driver in config.sys

    on top of this all the characters were fixed width courier 10
  • Strider590
    Strider590 Posts: 11,874 Forumite
    This is not worth the hassle.

    You could detect Windows version (ver command) and run a different script for each version, but this really isn't worth the hassle.

    You also have the issue that your only going to see this box if there is a delay or a pause command, pause is almost always pointless and "timeout" (delay command) doesn't work in windows versions before Win 7.
    “I may not agree with you, but I will defend to the death your right to make an a** of yourself.”

    <><><><><><><><><<><><><><><><><><><><><><> Don't forget to like and subscribe \/ \/ \/
  • John_Gray
    John_Gray Posts: 5,843 Forumite
    Part of the Furniture 1,000 Posts Name Dropper Photogenic
    Timeout?
    Real BATch writers use
    PING -4 -n 11 127.0.0.1 > nul
    (for a 10-second delay)!
  • esuhl
    esuhl Posts: 9,409 Forumite
    Part of the Furniture 1,000 Posts Name Dropper
    edited 10 February 2017 at 9:48AM
    Strider590 wrote: »
    This is not worth the hassle.

    Quite possibly! But it's interesting, nonetheless...
    Strider590 wrote: »
    You could detect Windows version (ver command) and run a different script for each version, but this really isn't worth the hassle.

    But... the Windows version wouldn't by itself indicate how to display a box character -- it would also depend on the code page in use.
    Strider590 wrote: »
    You also have the issue that your only going to see this box if there is a delay or a pause command, pause is almost always pointless and "timeout" (delay command) doesn't work in windows versions before Win 7.

    I use "timeout" commands, which are definitely not pointless, but I didn't realise it only works in Win7 and later. I guess I'll try the ping workaround above, but...
    John_Gray wrote: »
    Timeout?
    Real BATch writers use
    PING -4 -n 11 127.0.0.1 > nul
    (for a 10-second delay)!

    Why does pinging the loopback interface eleven times cause a ten second delay...?! Does the ping command automatically wait one second before issuing a subsequent ping?

    EDIT: I just found this page which explains various ways of getting a batch script to pause execution. It also shows the use of a ping command, but in a somewhat different manner.

    http://www.robvanderwoude.com/wait.php

    EDIT2: Apparently "timeout" works from Vista onwards. That might be good enough for me, although if I can get the script working with XP too, why not.

    https://technet.microsoft.com/en-us/library/cc754891(v=ws.11).aspx
  • John_Gray
    John_Gray Posts: 5,843 Forumite
    Part of the Furniture 1,000 Posts Name Dropper Photogenic
    esuhl wrote: »
    Why does pinging the loopback interface eleven times cause a ten second delay...?! Does the ping command automatically wait one second before issuing a subsequent ping?
    Aha! Did you do physics at skool?! And did you have to time an event by counting, starting at zero, then one, two, etc?

    Think of a set of fence posts, each a metre apart.
    For a fence 10 metres long you need 11 fence posts.

    For PING, the number of PINGs corresponds to the number of fence posts, since a PING is issued immediately, then 10 more at 1 second intervals.

    I believe this is what is called "a feature"!
  • paddyrg
    paddyrg Posts: 13,543 Forumite
    Code pages were more or less designed out with Unicode (2-bits per character) specifically because it was such a horrible cludge to use code pages for internationalisation in the first place. If you can munge your code to be unicode-friendly it may be another option
  • esuhl
    esuhl Posts: 9,409 Forumite
    Part of the Furniture 1,000 Posts Name Dropper
    John_Gray wrote: »
    Aha! Did you do physics at skool?! And did you have to time an event by counting, starting at zero, then one, two, etc?

    Think of a set of fence posts, each a metre apart.
    For a fence 10 metres long you need 11 fence posts.

    For PING, the number of PINGs corresponds to the number of fence posts, since a PING is issued immediately, then 10 more at 1 second intervals.

    I believe this is what is called "a feature"!

    Ah, so I was right. How reliable is the 1-second interval? Is it documented as such on all Windows versions, or does it depend on other things?
    paddyrg wrote: »
    Code pages were more or less designed out with Unicode (2-bits per character) specifically because it was such a horrible cludge to use code pages for internationalisation in the first place. If you can munge your code to be unicode-friendly it may be another option

    I've discovered that I can use UTF-8 without a BOM (byte order mark) for the batch file. Echoing UTF-8 characters to a text file works fine. When Notepad opens the generated file, it assumes UTF-8 encoding (because of the presence of the UTF-8 encoded characters).

    Unfortunately, the console runs in ANSI mode by default. I presume echoing to file works because the UTF-8 characters are simply treated as individual bytes -- the console doesn't need to recognise them as UTF-8.

    However, this means that it's not possible to display UTF-8 characters on-screen by default. And displaying extended ANSI characters depends both upon the code page in use, and the way that the characters are interpreted in the batch file itself.

    Also, I don't think I can guarantee that any particular code page will be available on every machine.

    I discovered that you can start CMD .EXE with the /U switch to enable Unicode mode, and that Microsoft lists 65001 as the code page for UTF-8, but this doesn't seem to work either. And anyway, I'm not sure it would be easy to change to a new Unicode console from within a batch file -- I don't want users to have to do anything other than double-click the file to run it.

    Hmmm...
This discussion has been closed.
Meet your Ambassadors

🚀 Getting Started

Hi new member!

Our Getting Started Guide will help you get the most out of the Forum

Categories

  • All Categories
  • 350.9K Banking & Borrowing
  • 253.1K Reduce Debt & Boost Income
  • 453.5K Spending & Discounts
  • 243.9K Work, Benefits & Business
  • 598.7K Mortgages, Homes & Bills
  • 176.9K Life & Family
  • 257.1K Travel & Transport
  • 1.5M Hobbies & Leisure
  • 16.1K Discuss & Feedback
  • 37.6K Read-Only Boards

Is this how you want to be seen?

We see you are using a default avatar. It takes only a few seconds to pick a picture.