The truth is rarely pure and never simple

Textlänge in unterschiedlichen Sprachen

Damit Artikel für den Seitenspiegel schon näherungsweise die richtige Länge haben, wenn sie für das Layout vorliegen, wird oft gefordert, ein bestimmtes Zeichenlimit einzuhalten. Leider ist diese Vorgabe aus verschiedenen Gründen selten hilfreich – insbesondere bei kurzen Texten:

  1. Die Schriftart hat zwar einen theoretisch großen Einfluss, jedoch ist davon auszugehen, dass der Setzer in der Vorgabe den Schnitt der Schrift berücksichtigt hat. Immerhin ist damit die Zeichenanzahl präziser als “eine halbe Seite”.
  2. Mit Ausnahme von dicktengleichen Schriften sind die verschiedenen Buchstaben nicht gleich breit. Damit beeinflusst also die Wortwahl die Textlänge, sodass im geringen Umfang durch Synonyme noch getrickst werden kann.
  3. Ligaturen führen dazu, dass die Buchstabenreihenfolge einen Einfluss auf die Textbreite hat: z.B. “lf” und “fl” sind nicht zwingend gleich breit.

Glücklicherweise ist der Effekt der Ligaturen vergleichsweise klein, sodass ich mich hier auf den zweiten Punkt konzentrieren möchte.

Ausgehend von den Buchstabenhäufigkeiten ergibt sich für die Schriftart “Arial” (s.u.) folgendes Bild: wenn man die durchschnittliche Länge eines deutschen Textes zugrundelegt, so ist das adäquate Zeichenlimit im Englischen um 1,99% und im Französischen um 2,54% höher – die deutsche Sprache scheint Buchstaben zu bevorzugen, die bei dieser Schriftart breit geschnitten sind. Natürlich ist das (siehe oben) von der Schriftart abhängig und folglich wenig übertragbar. Wer das für andere Sprachen, den eigenen Blindtext oder andere Schriftarten probieren möchte, kann das folgende Python-Skript nutzen, das die durchschnittlichen Breiten errechnet, ohne auf Ligaturen Rücksicht zu nehmen (wer mir das nicht glaubt, möge die Zeilen auskommentieren, die mit “##” beginnen).

#!/usr/bin/python
import pygame as pg
##import random as r

pg.font.init()

def textwidth(text):
    font = pg.font.SysFont('Arial', 12)
    try:
        rendered = font.render(text, 1, (0, 0, 0))
    except:
        # text is too long
        l = len(text)/2
        return textwidth(text[:l])+textwidth(text[l:])
    return rendered.get_rect().width

# percentages for a, b, c... from http://de.wikipedia.org/wiki/Buchstabenh%C3%A4ufigkeit
languages = {
    'german': [6.51, 1.89, 3.06, 5.08, 17.40, 1.66, 3.01, 4.76, 7.55, 0.27, 1.21, 3.44, 2.53, 9.78, 2.51, 0.79, 0.02, 7.00, 7.27, 6.15, 4.35, 0.67, 1.89, 0.03, 0.04, 1.13],
    'english': [8.167, 1.492, 2.782, 4.253, 12.702, 2.228, 2.015, 6.094, 6.966, 0.153, 0.772, 4.025, 2.406, 6.749, 7.507, 1.929, 0.095, 5.987, 6.327, 9.056, 2.758, 0.978, 2.360, 0.150, 1.974, 0.074],
    'french': [7.636, 0.901, 3.260, 3.669, 14.715, 1.066, 0.866, 0.737, 7.529, 0.545, 0.049, 5.456, 2.968, 7.095, 5.378, 3.021, 1.362, 6.553, 7.948, 7.244, 6.311, 1.628, 0.114, 0.387, 0.308, 0.136]
    }

print '(language) (avgerage width) (textwidth) (number of characters)'
for lang, data in languages.items():
    chars = [chr(ord('a')+char) for char in range(0,26) for number in range(0,int(data[char]*1000))];
    l = len(chars)
    ##r.shuffle(chars)
    tw = textwidth(''.join(chars))
    print '(%s) '*4 % (lang, tw/float(l), tw, l)