17

So I have this file that I download via ftp. The file is just a config file for a system at my company I work for. Once the file is downloaded I open the file and processor the file. Part of the processing of the file is to check to see if a line starts with a Unicode character \u001a.

This is where I am stumped because .StartsWith("\u001a") is always true, yet I cannot see why. If I view the file in Notepad++ or in a hex editor, I just don't see that.

So there is something I am missing here.

Here's a minimal example (fiddle):

// prints True in .NET 5
Console.WriteLine("Hello".StartsWith("\u001a"));
Magnetron
  • 7,495
  • 1
  • 25
  • 41
Gaz83
  • 2,293
  • 4
  • 32
  • 57
  • Comments are not for extended discussion; this conversation has been [moved to chat](https://chat.stackoverflow.com/rooms/237509/discussion-on-question-by-gaz83-need-understanding-as-to-why-string-startswith). – Samuel Liew Sep 26 '21 at 09:31

1 Answers1

9

It's because a breaking change in the globalizations APIs in .NET 5. You can choose one of the following approaches

  1. Use StringComparison.Ordinal or OrdinalIgnoreCase
  2. Use NLS instead of ICU, with one of the following ways:
  • In the project file:
<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
  • In the runtimeconfig.json file:
{
  "runtimeOptions": {
     "configProperties": {
       "System.Globalization.UseNls": true
      }
  }
}
  • By setting the environment variable DOTNET_SYSTEM_GLOBALIZATION_USENLS to the value true or 1.
Magnetron
  • 7,495
  • 1
  • 25
  • 41