title: Why is "ss" equal to the German sharp-s character 'ß'?
body: <p>Coming from <a href="https://stackoverflow.com/questions/29845211/culture-aware-string-comparison-for-umlaute">this question</a> I'm wondering why <code>ä</code> and <code>ae</code> are different(which makes sense) but <code>ß</code> and <code>ss</code> are treated as equal. I haven't found an answer on SO even if <a href="https://stackoverflow.com/questions/44288/differences-in-string-compare-methods-in-c-sharp">this question</a> seems to be related and even mentions <em>"that <code>ß</code> will compare equal to <code>SS</code> in Germany, or similar"</em> but not why. </p>
  
  <p>The only resource on MSDN I found was this: <a href="https://msdn.microsoft.com/en-us/library/vstudio/cc165449.aspx" rel="nofollow noreferrer">How to: Compare Strings</a></p>
  
  <p>Here is mentioned following but also lacks the <em>why</em>:</p>
  
  <pre><code>// "They dance in the street." 
  // Linguistically (in Windows), "ss" is equal to 
  // the German essetz: 'ß' character in both en-US and de-DE cultures. 
  .....
  </code></pre>
  
  <p>So why does this evaluate to <code>true</code>, both with <code>de-DE</code> culture or any other culture:</p>
  
  <pre><code>var ci = new CultureInfo("de-DE");
  int result = ci.CompareInfo.Compare("strasse", "straße", CompareOptions.IgnoreNonSpace); // 0
  bool equals = String.Equals("strasse", "straße", StringComparison.CurrentCulture); // true
  equals = String.Equals("strasse", "straße", StringComparison.InvariantCulture);  // true
  </code></pre>