Umlauts Broken After a WordPress Move? How Mojibake Happens – and How to Fix It

After a WordPress move, do you see characters like Grüße instead of Grüße everywhere? We explain in plain terms why umlauts break when cloning – and how to repair the damage safely and completely.

Scattered metal type letters and tweezers, a cobalt-blue sphere between themAI-generated
Contents

Your website was running perfectly a moment ago – after the move to a new server, suddenly “Grüße” appears everywhere instead of “Grüße”. Umlauts (German letters like ä, ö, ü), the ß and special characters have turned into strange letter soup. The good news up front: your text is not lost. This is a well-known, clearly named problem with a reliable fix. In this post we explain in plain terms what happens technically, why the move of all things causes the damage – and how to fix it completely, step by step.

The symptom: “Grüße” becomes “Grüße”

The damage always looks the same and is easy to recognize. Wherever a German umlaut or special character should appear, two or more foreign characters show up instead. Typical examples from real cases:

How it should lookHow it looks broken
GrüßeGrüße
Über unsÜber uns
AußenAußen
ausgewählte Gerichteausgewählte Gerichte

Experts call this character soup mojibake (Japanese for “character transformation”). The pattern gives it away: almost always a capital à appears, followed by a second character. That à is the signature of the problem – and at the same time the key to the repair.

Don’t panic: nothing is lost

Your text is fully intact

Even if it looks bad: with this error not a single character is lost. The information is stored completely in the database – it is just interpreted wrongly and therefore displayed wrongly. The damage was caused systematically, following a fixed pattern, so it can also be reversed systematically and without loss. All that matters: create a backup before the repair and choose the direction of the correction correctly.

That is the crucial difference from real data loss: here the letters are not gone, just “mistranslated”. If you know the wrong translation, you can reverse it exactly. And we know it.

How WordPress stores text (explained simply)

To understand what goes wrong, you only need one idea: a computer does not store letters, it stores numbers (bytes). Which number stands for which letter is defined by the so-called character set – essentially the dictionary between numbers and letters. Three terms matter for German websites:

Character setWhat it can doUmlaut “ü” =
latin1 (ISO-8859-1)Old Western European character set, only 1 byte per character, no emojis1 byte
utf8 (utf8mb3)Modern standard, each character 1–3 bytes, scripts from around the world2 bytes
utf8mb4Like utf8, but with emojis as well – recommended for WordPress today2 bytes

The crux: in UTF-8 a “ü” is two bytes long (technically: the numbers C3 A4 for “ä”, C3 BC for “ü”). If a program mistakenly looks up these two bytes in the old latin1 dictionary, it reads two separate characters from them – namely à and ¼. That is exactly where the soup begins.

Three places have to match

In every WordPress installation there are three places where a character set is defined: 1. in the file wp-config.php (the DB_CHARSET setting), 2. in the database tables themselves and 3. in the connection between WordPress and the database. As long as all three “speak” the same language, everything is fine. If they don’t match, mojibake appears.

Why the original works but the clone is broken

This is the question almost everyone affected asks: “Everything was right on the old site – why not anymore?” The answer is surprisingly logical.

Many older installations – especially those created with a 1-click installer in cPanel (Softaculous & co.) – have a small inconsistency built in: the text is stored as modern UTF-8, but the database is declared to the outside as latin1. That sounds like a mistake – and in principle it is one. But as long as saving and displaying happen on the same system with the same (wrong) settings, the two errors cancel each other out. The site looks perfect. Nobody notices anything.

The move destroys exactly this silent agreement. The migration tool takes the “latin1” label of the old database literally and dutifully “converts” the data to UTF-8 – even though it is already UTF-8. Every umlaut byte gets encoded a second time. That is how one character suddenly becomes two. On the new server the compensating counter-inconsistency is missing, and the soup becomes visible.

  1. Original: stored as UTF-8

    In the old database “Grüße” is correctly stored as UTF-8 – the “ü” takes up two bytes. Everything is stored cleanly.

  2. Original: two errors cancel out

    The database is labeled latin1 even though it contains UTF-8. WordPress reads it back with the same skew – the display is correct anyway. Nobody notices the problem.

  3. Move: the tool takes “latin1” seriously

    When cloning, Duplicator (or another migration tool) reads the “latin1” label and converts the data to UTF-8 – even though it is already UTF-8. One conversion too many.

  4. Move: every umlaut gets doubled

    The unnecessary conversion turns the “ü” (bytes C3 BC) into four bytes – the characters “ü”. One character has become two. This is what is called double encoding.

  5. Clone: the soup becomes visible

    On the new server the compensating skew no longer fits. WordPress now honestly shows what is in the database: “Grüße” instead of “Grüße”.

What “double encoding” means in practice

Think of it as a double translation: a German sentence is translated into English – and then the English result is treated as if it were German and “translated” again. Nonsense comes out. With mojibake it is exactly the same, only with bytes:

Richtig:        ü   =  Bytes  C3 BC          (UTF-8, ein Zeichen)
Eine Übersetzung
zu viel:        ü → „Ó + „¼“ → Bytes  C3 83 C2 BC   (= "ü", zwei Zeichen)

Dasselbe für ß:  ß  =  C3 9F   →   "ß"  =  C3 83 C2 9F

Because this process follows a fixed rule and affects the entire database uniformly, it can be reversed exactly: you simply have to calculate the unnecessary translation back exactly once. Afterwards the clean “ü” is there again.

The typical trap: cPanel installers and Duplicator

The problem almost always occurs in the same constellation – so it is worth knowing it:

Typical triggers for mojibake after a move

Important: it’s not the theme

Many people look for the error in the theme or a plugin first and spend hours trying things. Wasted effort: the soup is in the database, not in the theme files. You can tell because titles, menus, settings and even the site name are affected too – everywhere text comes from the database.

Repair step by step

Now for the solution. The repair is quite doable, but it intervenes directly in the database. That is why one iron rule applies before anything else happens:

Backup first – no exceptions

Create a complete backup of the database (e.g. as an SQL export) before any intervention. If the correction runs in the wrong direction, it can render data unusable. With a backup that is only half as bad – you simply restore it and try again. Without a backup, a mistake gets really expensive. The safest way is to test the repair on a copy of the site first.

Step 1: The diagnosis – which case is it?

There are two variants of the problem, and they need different solutions. The best approach is to look closely at an affected piece of text:

  • Case A – double encoding: You see patterns like ü, ö, ä, ß (always with the capital Ã). This is the most common case after a Duplicator move. The data is UTF-8, but encoded once too often.
  • Case B – genuine latin1: The text was never UTF-8 but “genuine” old latin1, and is now output as UTF-8. Here a plain change of the character set helps, not a back-calculation.

We show the repair here for by far the most common case A (the telltale Ã). With a database tool like phpMyAdmin (included with almost every hosting plan) or Adminer / TablePlus you can check whether the double pattern really is present everywhere.

Step 2: The correction via SQL

The actual cure consists of undoing the unnecessary translation exactly once. In SQL a compact command does this, which you run per text column. It reads the text back as latin1 (undoing the conversion that was performed once too often) and saves it as clean UTF-8:

Example with the standard prefix wp_ – adapt it to your own prefix:

-- Beiträge und Seiten
UPDATE wp_posts SET
  post_content = CONVERT(CAST(CONVERT(post_content USING latin1) AS BINARY) USING utf8mb4),
  post_title   = CONVERT(CAST(CONVERT(post_title   USING latin1) AS BINARY) USING utf8mb4),
  post_excerpt = CONVERT(CAST(CONVERT(post_excerpt USING latin1) AS BINARY) USING utf8mb4);

-- Einstellungen (Seitentitel, Slogan, viele Plugin-Optionen)
UPDATE wp_options SET
  option_value = CONVERT(CAST(CONVERT(option_value USING latin1) AS BINARY) USING utf8mb4);

-- Zusatzfelder von Beiträgen (z. B. ACF, SEO-Plugins)
UPDATE wp_postmeta SET
  meta_value = CONVERT(CAST(CONVERT(meta_value USING latin1) AS BINARY) USING utf8mb4);

-- Kommentare, Kategorien/Schlagwörter
UPDATE wp_comments SET comment_content = CONVERT(CAST(CONVERT(comment_content USING latin1) AS BINARY) USING utf8mb4);
UPDATE wp_terms    SET name            = CONVERT(CAST(CONVERT(name            USING latin1) AS BINARY) USING utf8mb4);

Two pitfalls you should know about

1. Table prefix: Replace wp_ with your real prefix – many installations use something like wpic_ or wp123_. 2. Run only once: Let the command run exactly once per column. If you run it twice, you turn clean umlauts into new soup. It is best to limit the correction to rows that actually contain the à pattern.

Step 3: The safe process at a glance

  1. Create a backup

    Pull a complete database export and store it safely. Only then continue.

  2. Test on a copy

    Restore the backup into a test or staging environment and run the repair there first. That way you see the result without risk to the live site.

  3. Run the correction

    Run the SQL commands exactly once per text column. With many plugin tables it is worth including their text columns too.

  4. Check the result

    Spot checks on the site and in the database: are clean umlauts showing everywhere now? Does the capital “Ô no longer appear anywhere? Then it worked.

  5. Clear the cache

    Finally, clear all caches – page cache, optimization plugins and, if needed, the browser cache. Otherwise the site still shows old, cached soup versions.

Prefer no SQL? There are other ways too

You don’t necessarily have to write SQL yourself. Many hosts offer an SQL tab in phpMyAdmin where you only paste the commands. Alternatively, an experienced service provider usually does the repair in under an hour. Caution: the popular plugin “Better Search Replace” only replaces text – it can not reliably fix this character set error, because here bytes, not words, have to be recalculated.

So it doesn’t happen again: move it properly

The best repair is the one you never need. Two measures prevent soup from appearing again with the next move:

How to move a WordPress site without umlaut problems

The most sustainable step is switching to utf8mb4. This character set is the WordPress standard today, handles all languages and even emojis – and removes the old latin1 skew for good. After that, umlauts are no issue for future moves either.

When you should rather ask a professional

Let’s be honest: direct interventions in the database are not something you do on the side. Get support if any of these points applies to you:

  • You are unsure about backups, phpMyAdmin or SQL.
  • It is an important live shop or a business-critical site.
  • The damage is mixed (partly soup, partly clean) – then the direction of the correction is not clear and a wrong run causes damage.
  • Besides WordPress, other systems are connected to the same database.

Mojibake looks like a catastrophe but is actually one of the most rewarding WordPress problems: the data is fully there, the error follows a fixed pattern – and that is exactly why it can be reversed cleanly and completely.

Michael Rademacher, Founder of realmaker

Conclusion

If “Grüße” appears everywhere after a move instead of “Grüße”, that is not data loss but double encoding: the umlauts were converted from latin1 to UTF-8 once too often during cloning. The original only worked because two character set errors canceled each other out there – the move broke that balance. The solution is to calculate the unnecessary conversion back exactly once with a targeted SQL command. With a backup, a test on a copy and clearing the cache afterwards, the nightmare is over in no time – and with the switch to utf8mb4 it won’t come back.

Have mojibake repaired · More about our WordPress services

This post is part of our WordPress knowledge series from realmaker – your creative agency for film, web and AI solutions.

Frequently asked questions

Is my text lost now?

No. With this type of error no character is lost. The information is stored completely in the database, it is just displayed wrongly. Once the unnecessary encoding is calculated back, all umlauts and special characters are displayed correctly again.

Can I fix this with “Search & Replace”?

Only to a limited extent and at high risk. Plugins like “Better Search Replace” swap text, but they don’t recalculate bytes. You would have to replace every single broken combination by hand – error-prone and never complete. The clean way is the byte-exact back-calculation via SQL.

Why did the old site look right?

Because on the old server two character set errors canceled each other out: the data was UTF-8, the database was labeled latin1, and WordPress read it back with the same skew. The result happened to be correct. With the move this balance breaks, and the actual state of the data becomes visible.

How do I avoid the problem with the next move?

Transfer the database byte for byte, without automatic character set conversion, and switch the site to utf8mb4 beforehand – in the database, in the tables and in wp-config.php. Then the same character set fits everywhere, and umlauts survive any move unharmed.

Michael Rademacher

Founder of realmaker

Michael Rademacher founded realmaker in 2003. He develops WordPress websites and software, produces films and live streams, and writes here about what he learns in client projects.

About Michael

Rather have it maintained?

Updates, backups and monitoring are handled by wp-einfach.de – for a fixed monthly price (service in German).

Go to wp-einfach.de