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 ×)
= (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 «t;
«
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 »t;
»
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