2014-01-20

Screen readers are designed to do one thing: read what’s on the screen. That’s why they call them screen readers, right? You would think that screen reader software would have perfected the art of reading text by now, because that was the whole reason why screen readers were invented. If there’s one thing a screen reader ought to do really well, it’s read what’s on the screen.

Unfortunately, screen readers don’t always read what’s on the screen. Sometimes that’s OK, but sometimes that’s really bad. If a screen reader fails to read important text, the user will fail to understand it. It’s not the user’s fault, and it’s usually not the web developer’s fault either. These are problems with the screen reader software itself. It’s high time for screen reader programmers to fix these problems, and to get some consistency across brands of screen readers, because right now it’s kind of a mess… and I’m just talking about text, typographic symbols, and static HTML here: the things that screen readers are supposed to excel at reading.

Part 1 of this series focuses on the way screen readers read (or don’t read) punctuation and typographic symbols.

Part 2 will focus on the problems with inline semantic markup.

Part 3 will focus on problems with pronunciation, including common content — like telephone numbers, dates, and abbreviations — as well as uncommon or new words, or words with more than one possible pronunciation.

You Can’t Count on Screen Readers to Read Most Punctuation or Typographic Symbols

The way screen readers treat punctuation is incredibly inconsistent from one screen reader to another, and there isn’t a single screen reader on the market that can reliably handle the full set of punctuation marks and typographical symbols that you might want to use. If you type an HTML document using all the punctuation marks available on your keyboard and listen to a screen reader read the document in a web browser, you’ll hear only some of the punctuation and characters read aloud to you. If you use HTML entities or other special characters, you’ll hear even less.

This is partly (but not entirely) by design. Screen reader manufacturers have understandably decided that most users don’t need to hear every comma, period, and apostrophe in a document. Screen readers will pause at commas rather than say “comma,” and screen readers will say “don’t” rather than say “don apostrophe t.” Those are reasonable decisions. But every screen reader has major flaws in reading some aspect of typographical symbols.

Here’s a sample of some of the problems:

The NVDA screen reader, for instance, doesn’t read hardly any typographical symbols at all in its default configuration, making common symbols like asterisks and plus symbols essentially useless to NVDA users. This means web developers can’t use an asterisk to denote a required field on a form, unless they supplement the asterisk with some other NVDA-friendly method.

Similarly, NVDA ignores the plus and equals symbols. It says “five two seven” when it should say “five plus two equals seven,” making it hard — or impossible — to write basic math expressions.

JAWS reads the plus symbol correctly, but not the minus symbol. Jaws incorrectly says “five dash two” when it should say “five minus two,” even when using the HTML entity − (not a regular dash) to specify the minus symbol.

JAWS also reads the “less than or equal to” symbol incorrectly. JAWS says “equals,” which is wrong. Between NVDA and JAWS, web authors who want to write even the most basic of arithmetic expressions — one plus one, or one minus one, for example — can’t count on screen readers to read them right. That’s a serious limitation.

On the Mac side, VoiceOver doesn’t inform users about quotation marks, parentheses, or dashes, making it so users don’t know when quotation or parenthetical phrases begin or end. To its credit, VoiceOver does pause briefly for these elements, but users won’t know the difference between a dash, parentheses, or a quotation, because all pauses sound the same, even though the reasons for the pauses are all different, and should convey different semantic meanings.

These are just some of the examples of where things can go wrong when trying to use basic punctuation or typographic symbols to communicate on the web. These are significant flaws in the most basic of screen reader functions: reading what’s on the screen. There is too much potential for screen readers to miss out on the information that is right there in front of them. I’m not talking about anything complicated here. I’m talking about the text and symbols right there on your keyboard, and the ones available in HTML entities and other standard character sets.

It’s time for screen reader manufacturers to step up to the plate and design software that does a better job of actually reading what’s on the screen.

User Verbosity Preferences versus Default Settings

Screen readers have verbosity settings that let users choose how much punctuation to hear. I’m not saying to take away user preferences. Let users choose their own verbosity level, but the default level needs to be high enough for average users to get the information communicated in typical web content by the authors. Authors need to know that they can trust screen readers to read the text that the authors write, and right now, author’s can’t trust screen readers to do that.

There are certainly reasons for users to ignore some kinds of punctuation under some circumstances. It would be annoying to most users to hear every single comma or period in every sentence sentence, for example. And sometimes users would rather hear a pause than hear every opening and closing parenthesis. That’s understandable. By pausing instead of reading all punctuation, screen readers sound more natural and human-like, and that can be a good thing.

But when the punctuation or typographic symbols convey important meaning, users need to be able to hear the punctuation and symbols, or the meaning will be lost. At the extreme end, blind web developers probably need to hear all the punctuation when reading HTML or JavaScript code, for example. They may want to toggle the verbosity setting to “all punctuation” when reading code, and use a less verbose mode for reading prose. There’s no need to force a high verbosity level on all users.

Even so, the verbosity probably should not be set so low by default that the screen reader can’t even read a URL correctly (for example, by not reading the colon or slashes), or convey even the most basic punctuation to readers. NVDA’s settings, in particular, are so sparse that users hear almost no punctuation or symbols at all. That doesn’t seem right, and it leaves authors with a no-win choice of either stripping the document of nearly all punctuation for all users, or writing out everything in words instead of punctuation (like “1 plus 1 equals 2″ instead of “1+1=2″), or simply saying “I don’t care what the screen reader does. It should read the text, but it doesn’t. It’s not my fault. I’m not responsible, because I did my part by putting the text in there.”

Screen Reader Flaws Breed Apathy

Screen reader flaws breed apathy among web developers and content writers. Such apathy is counter-productive to the goal of creating an accessible web. Too many people will just assume that screen readers are always a little bit broken, and not bother to investigate workarounds, especially for the simplest tasks, like reading the text and punctuation on the screen. No one should have to wonder if a screen reader will read text.

Testing How Screen Readers Read Typographical Symbols

I knew that screen readers were inconsistent in the way they handled typographical symbols, but I didn’t know all of the intricate details of exactly what they did or didn’t read, so I set up some tests.

 

Versions Tested:

NVDA 2013.3, tested with Firefox 26.0 on Windows 7

JAWS 15.0.4203, tested with Internet Explorer 9.0.23 on Windows 7 and Internet Explorer 11 on Windows 8

VoiceOver OSX 10.9.1, tested with Safari 7.0 (9537.71)

In all cases, the screen reader language was set to English. The doctype was HTML 5. The character encoding was UTF-8.

I didn’t test every possible typographical character possible; not even close. I chose from among the more common characters; characters that most English-speaking authors would expect screen readers to get right. A more comprehensive test would involve different languages, all the characters in UTF-8, and all the HTML entities. I’m not going to be that thorough. I admit I sympathize with screen reader manufacturers when considering the scale of the task once you consider all possible character sets, but with just this limited set of common characters, the results are still disappointing.

Findings:

 

JAWS Bugs

First of all, it’s time to fix the bugs, in JAWS in particular. How is it that there are still bugs in screen reader software for reading basic text and typographical symbols? That’s something screen readers should have perfected long, long ago.

JAWS Bugs:

Symbol

Markup

JAWS says

JAWS should say





“dash”

minus





“equals”

less than or equal to





“equals”

greater than or equal to





“tilde”

approximately equals





“question mark”

not equals

 

Safe Characters (all screen readers read the characters out loud):

If you need the typographical symbols to be read out loud explicitly, of the 91 symbols tested, the only “safe” symbols to use across all screen readers tested in their default configurations are these 17:

@ (the at symbol)

& (ampersand, written either as & or & in the markup)

/ (slash)

© (copyright, written as ©)

® (registered, written as ®)

™ (trademark, written as ™)

¶ (paragraph, written as ¶)

• (bullet, written as •)

$ (dollar)

€ (Euro, written as €)

£ (British pound, written as £)

¥ (Yen, written as ¥)

% (percent)

½ (one half, written as ½)

¼ (one fourth, written as ¼)

¾ (three fourths, written as ¾)

° (degrees, written as °)

Everything else fails in at least one of the three screen readers tested. When I say it “fails,” I mean that the symbol itself isn’t read out loud. Sometimes that’s OK, but often it is not OK.

 

Safe, But Sometimes Unspoken Characters (often accompanied by a pause or voice inflection)

Just to be clear: just because a screen reader doesn’t read something out loud doesn’t always mean you can’t use it. It just means that the meaning of that symbol will not be communicated explicitly. If the meaning of the symbol is essential to your message, be very cautious in how you use the symbols. If the meaning of a symbol is only tangential or not essential to the message, you have a bit more freedom.

You can use such punctuation as periods, commas, semi-colons, colons, parentheses, brackets, quotation marks, dashes, exclamation points, question marks and some others. JAWS is the most likely of the screen readers to read these kinds of punctuation marks. NVDA is the least likely. Across all three screen readers, most of these punctuation marks will generate pauses, or voice inflections in the case of exclamation marks and question marks. Just don’t expect the screen reader to actually read most of these punctuation marks themselves out loud unless the user pauses and listens character by character, or unless the user changes the default settings of the screen reader.

To give a specific example, if you’re OK with the user simply hearing a pause at the beginning and end of a quotation, you’ll be fine. But if you need the user to know that the reason for the pause is because there are quotation marks, you’re out of luck in all screen readers except JAWS.

 

Unread Characters (meaning that at least one screen reader will not read the character out loud):

~ (tilde)

` (backtick)

! (exclamation mark)

¡ (inverted exclamation mark, written as ¡)

# (pound sign)

^ (caret)

* (asterisk)

( (left parenthesis)

) (right parenthesis)

- (dash)

— (m dash, written as —)

-- (double dash)

– (n dash, written as –)

_ (underscore)

, (comma)

. (period)

… (pseudo ellipses, three periods)

… (ellipses, written as …)

\ (backslash)

| (vertical bar)

? (question mark)

¿ (inverted question mark, written as ¿)

; (semi-colon)

: (colon)

” (quotation mark)

” (quotation mark, written as ")

” (left double quotation mark, written as “)

“ (right double quotation mark, written as ”)

« (left double angle bracket, written as «)

»; (right double angle bracket, written as »)

‹ (left single angle bracket, written as ‹)

› (right single angle bracket, written as ›)

‘ (single quote, or apostrophe)

’ (right single quote, written as ’)

‘ (left single quote, written as ‘)

{ (left brace)

} (right brace)

[ (left bracket)

] (right bracket)

§ (section, written as §)

· (small bullet, written as ·)

† (dagger, written as †)

‡ (double dagger, written as ‡)

→ (right arrow, written as →)

← (left arrow, written as ←)

↑ (up arrow, written as ↑)

↓ (down arrow, written as ↓)

↔ (horizontal arrow, written as ↔)

⇐ (left double arrow, written as ⇐)

⇒ (right double arrow, written as ⇒)

⇑ (up double arrow, written as ⇑)

⇓ (down double arrow, written as ⇓)

⇔ (horizontal double arrow, written as ⇔)

♠ (spades, written as ♠)

♣ (clubs, written as ♣)

♥ (hearts, written as ♥)

♦ (diamonds, written as ♦)

+ (plus)

− (minus, written as −)

± (plus or minus, written as ±)

÷ (divided by, written as ÷)

× (multiplied by, written as &times)

= (equals)

≠ (not equals, written as ≠)

≈ (approximately equals, written as ≈)

‰ (per mil, written as ‰)

< (less than, written as <)

> (greater than, written as >)

≤ (less than or equal to, written as ≤)

≥ (greater than or equal to, written as ≥)

′ (prime, written as ′)

″ (double prime, written as ″)

∑ (sum, written as ∑)

The least verbose of the screen readers tested was NVDA, by a large margin. If not for NVDA, the number of characters read out loud would be much higher. JAWS and VoiceOver have problems of their own though.

Here are the detailed tables showing which symbols were, or weren’t read by which screen readers.

Grammatical Punctuation Marks

HTML Entities and Typographical Symbols

Currency

Mathematical Symbols

Grammatical Punctuation Marks

Symbol

The character by itself

In Context

JAWS 15

NVDA

VoiceOver

tilde

~

http://website.com/~user

By itself:

“tilde”

In context:

“H T T P colon slash slash website dot com slash tilde user”

By itself:

nothing

In context:

“H T T P slash slash website dot com slash user”

(NVDA does NOT mention the tilde or the colon.)

By itself:

“tilde”

In context:

“H T T P slash slash website dot com slash tilde user”

(VoiceOver reads the tilde, but not the colon)

backtick mark

`

&id=`1`

By itself:

“grave” (the “a” is pronounced with an “ah” sound, like the “a” in “bravo”)

In context:

“and I D equals grave one grave”

By itself:

nothing

In context:

“and I D one”

(NVDA does NOT pronounce the tick mark or the equals sign.)

By itself:

“accent”

In context:

“and I D equals one”

(VoiceOver does NOT read the backtick.)

exclamation mark

!

This is exciting!

This is exciting.

By itself:

“exclaim”

In context:

JAWS does not change voice inflection at all.

By itself:

nothing

In context:

NVDA changes the inflection very slightly (almost imperceptibly) when there is an exclamation mark at the end of a sentence.

By itself:

“exclaim”

In context:

Nothing. VoiceOver does not change voice inflection at all when a sentence ends in an exclamation mark.

inverted exclamation mark, typed as ¡

¡

Intersante. ¡Ay caramba!

Intersante. Ay caramba.

By itself:

“inverted exclaim”

In context:

JAWS changes the inflection of the last word, but does not mention the inverted exclamation mark at the beginning.

By itself:

nothing

In context:

NVDA reads the exclamation with a different inflection, but does not mention the inverted exclamation mark at the beginning.

By itself:

“inverted exclamation mark”

In context:

VoiceOver does NOT change voice inflection. (It also does NOT change language, even though lang=”es” is added to the td tag.

ampersand

@

I have a message for @paul

By itself:

“at”

In context:

“I have a message for at Paul” (But JAWS slurs the “at” and “Paul” together, so people might easily miss the “at”)

By itself:

“at”

In context:

“I have a message for at Paul”

By itself:

“at”

In context:

“I have a message for at Paul”

pound/hash/number sign

#

I live at apartment #40

By itself:

“number”

In context:

I live at apartment number 40″

By itself:

nothing

In context:

“I live at apartment 40″ (NVDA does NOT read the number sign)

By itself:

“number”

In context:

I live at apartment number 4 zero”

caret

^

This is ^not the worst I’ve seen

By itself:

“caret”

In context:

“This is caret not the worst I’ve seen”

By itself:

nothing

In context:

“This is not the worst I’ve seen

(NVDA does NOT read the caret)

By itself:

“caret”

In context:

“This is caret not the worst I’ve seen”

ampersand, typed as &

&

M&Ms

BB&T

black & white

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

ampersand

&

M&Ms

BB&T

black & white

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

By itself:

“and”

In context:

“M and M S,”

“B B and T,”

“black and white”

asterisk

*

Fields marked with * are required.

Name*

By itself:

“star”

In context:

“Fields marked with star are required”

“Name star”

By itself:

nothing

In context:

“Fields marked with are required” (NVDA does NOT say “star”)

“Name” (NVDA does NOT say “star”)

By itself: “star”

In context:

“Fields marked with star are required”

“Name star”

left parenthesis

(

I am (understandably) excited.

By itself:

“left paren”

In context:

“I am left paren understandably right paren excited”

By itself:

nothing

In context:

NVDA does not say anything, nor does it pause; it reads straight through

By itself:

“left paren”

In context:

VoiceOver pauses briefly for the opening and closing parentheses, but does not say anything.

right parenthesis

)

I am (understandably) excited.

By itself:

“right paren”

In context:

“I am left paren understandably right paren excited”

By itself:

nothing

In context:

NVDA does not say anything, nor does it pause; it reads straight through

By itself:

“right paren”

In context:

VoiceOver pauses briefly for the opening and closing parentheses, but does not say anything.

dash

-

blue-green.

This is — not unexpectedly — a parenthetical clause.

By itself:

“dash”

In context:

“blue dash green”

“This is m dash not unexpectedly m dash a parenthetical clause.”

By itself:

nothing

In context:

NVDA does not say anything, nor does it pause; it reads straight through

By itself:

“dash”

In context:

“blue green”. VoiceOver does not read the dash.

m dash, typed as —



This is also—not unexpectedly—a parenthetical clause.

By itself:

“m dash”

In context:

“This is also m dash not unexpectedly m dash a parenthetical clause.”

By itself:

nothing

In context:

NVDA does not say anything, nor does it pause; it reads straight through

By itself:

“m dash”

In context:

VoiceOver pauses briefly for each of the m dashes, but does not say anything.

n dash, typed as –



This is another – not unexpectedly – parenthetical clause.

This is another–not unexpectedly–parenthetical clause.

By itself:

“n dash”

In context:

“This is another n dash not unexpectedly n dash parenthetical clause.”

By itself:

nothing

In context:

NVDA does not say anything, nor does it pause; it reads straight through

By itself:

“n dash”

In context:

VoiceOver pauses briefly for each of the m dashes, without saying anything, but ONLY IF there are spaces between the words and the dashes. Without spaces, VoiceOver does not pause at all.

underscore

_

my_file_name.jpg

By itself:

“underline”

In context:

“my underline file underline name dot J P G”

By itself:

nothing

In context:

“my file name dot J P G” (NVDA does not say “underline”)

By itself:

“underline”

In context:

“my underline file underline name dot jaypeg”

comma

,

The house is green, red, and orange.

By itself:

comma

In context:

JAWS pauses briefly, but does not say “comma”

By itself:

nothing

In context:

NVDA pauses briefly, but does not say “comma”

By itself:

“comma”

In context:

VoiceOver pauses briefly, but does not say “comma”

period

.

I like cheese.

By itself:

“period”

In context:

JAWS pauses, but does not say “period”

By itself:

“dot”

In context:

NVDA pauses, but does not say “period”

By itself:

“period”

In context:

VoiceOver pauses, but does not say “period”

three periods (pseudo ellipses)



This sentence trails off… And here is another sentence.

By itself:

“dot dot dot”

In context:

“This sentence trails off dot dot dot and here is another sentence”

By itself:

nothing

In context:

NVDA pauses briefly, but does not read the periods

By itself:

nothing

In context:

VoiceOver does not say “ellipses,” but it does pause longer than normal.

ellipses typed as …



This sentence trails off… And here is another sentence.

By itself:

“ellipses”

In context:

JAWS does not say “ellipses,” but it does pause longer than normal.

By itself:

nothing

In context:

NVDA pauses briefly, but does not read the ellipses

By itself:

“ellipses”

In context:

VoiceOver does not say “ellipses,” but it does pause longer than normal.

forward slash

/

home/products/widgets

Give him/her a prize.

http://deque.com

By itself:

“slash”

In context:

“home slash products slash widgets”

“Give him slash her a prize”

H T T P colon slash slash deque dot com”

By itself:

“slash”

In context:

“home slash products slash widgets”

“Give him slash her a prize”

“H T T P slash slash deque dot com”

By itself:

“slash”

In context:

“home slash products slash widgets”

“Give him slash her a prize”

H T T P slash slash deque dot com”

backslash

\

c:\folder\file.docx

By itself:

“backslash”

In context:

“c colon backslash folder backslash file dot docx”

By itself:

nothing

In context:

nothing

By itself:

“backslash”

In context:

“c backslash folder backslash file dot docx”

vertical bar

|

Products | Our web site

By itself:

“vertical bar”

In context:

“Products vertical bar our web site”

By itself:

nothing

In context:

nothing

By itself:

nothing

In context:

“Products vertical line our web site”

question mark

?

What do you mean?

Are you crazy??

Are you still crazy?!?

By itself:

“question?”

In context:

JAWS changes the voice inflection of the last word in a sentence if the sentence ends in a question mark, to make it sound like someone asking a question.

Two question marks, or question marks mixed with exclamation marks are read the same as a single question mark.

By itself:

nothing

In context:

NVDA changes the voice inflection of the last word in a sentence if the sentence ends in a question mark, to make it sound like someone is asking a question

Two question marks, or question marks mixed with exclamation marks are read the same as a single question mark.

By itself:

“question”

In context:

VoiceOver changes the voice inflection of the last word in a sentence if the sentence ends in a question mark, to make it sound like someone asking a question.

Two question marks, or question marks mixed with exclamation marks are read the same as a single question mark.

inverted question mark, typed as ¿

¿

No estoy seguro. ¿Quién soy?

No estoy seguro. Quién soy.

By itself:

“inverted question”

In context:

JAWS changes the inflection for the question, but does not mention the inverted question mark at the beginning.

By itself:

nothing

In context:

NVDA changes the voice inflection for the question, but does not mention the inverted question mark at the beginning

By itself:

“inverted question mark”

In context:

VoiceOver does NOT change inflection (and it ignores the lang=”es” set on the td tag)

semi-colon

;

The sentence paused; but not for long.

By itself:

“semi-colon”

In context:

“The sentence paused semi-colon but not for long”

By itself:

nothing

In context:

NVDA pauses briefly, but does NOT read the semi-colon

By itself:

“semi-colon”

In context:

VoiceOver pauses briefly, but does NOT say “semi-colon”

colon

:

Gaseous: having the properties of a gas.

http://deque.com

By itself:

“colon”

In context:

 

“Gaseous colon having the properties of a gas”

“H T T P colon slash slash deque dot com”

By itself:

nothing

In context:

NVDA pauses briefly, but does NOT read the colon

By itself:

“colon”

In context:

VoiceOver pauses briefly, but does NOT say “colon”

double quotation mark



I feel “fine,” she said, sarcastically.

By itself:

“quote”

In context:

“I feel quote fine quote she said sarcastically”

By itself:

nothing

In context:

nothing

By itself:

“quote”

In context:

VoiceOver pauses briefly but does NOT say “quote”

double quotation mark, typed as "



I feel “fine,” she said, sarcastically.

By itself:

“quote”

In context:

“I feel quote fine quote she said sarcastically”

By itself:

nothing

In context:

nothing

By itself:

“quote”

In context:

VoiceOver pauses briefly but does NOT say “quote”

right double quotation mark



I feel “fine,” she said, sarcastically.

By itself:

“right quote”

In context:

“I feel left quote fine right quote she said sarcastically”

By itself:

nothing

In context:

“I feel fine, she said, sarcastically”

By itself:

“right double quotation mark”

In context:

VoiceOver pauses briefly but does NOT say anything

left double quotation mark



I feel “fine,” she said, sarcastically.

By itself:

“left quote”

In context:

“I feel left quote fine right quote she said sarcastically”

By itself:

nothing

In context:

“I feel fine, she said, sarcastically”

By itself:

“left double quotation mark”

In context:

VoiceOver pauses briefly but does NOT say anything

left double angle bracket, typed as &laquot;

«

This is a «word» surrounded by angle brackets.

By itself:

“left double angle bracket”

In context:

“This is a left double angle bracket word right double angle bracket surrounded by angle brackets”

By itself:

nothing

In context:

“This is a word surrounded by angle brackets”

By itself:

“left pointing double arrow”

In context:

VoiceOver pauses briefly, but does not pronounce the angle bracket.

right double angle bracket, typed as &raquot;

»

Home » Products

By itself:

“right double angle bracket”

In context:

“Home double angle bracket products”

By itself:

nothing

In context:

“Home products”

By itself:

“right pointing double arrow”

In context:

VoiceOver pauses briefly, but does not pronounce the angle bracket.

(written as ‹)



This is a ‹word› surrounded by angle brackets.

By itself:

nothing

In context:

“This is a word surrounded by angle brackets”

By itself:

nothing

In context:

“This is a word surrounded by angle brackets”

By itself:

“left pointing [unintelligible] quotation mark

In context:

VoiceOver pauses briefly, but does not pronounce the angle bracket.

(written as ›)



Home › Products

By itself:

nothing

In context:

“Home products”

By itself:

nothing

In context:

“Home products”

By itself: <img alt="yes" src="https://dequeuniversity.com/assets/images/html_css/template/green-check.png" w

Show more